예제 #1
0
        protected override TypeDesc MarshalArgument(TypeDesc managedType, ILEmitter emitter, ILCodeStream marshallingCodeStream, ILCodeStream unmarshallingCodeStream)
        {
            TypeSystemContext context = PInvokeMethodData.Context;

            if (PInvokeMethodData.GetCharSet() == PInvokeAttributes.CharSetUnicode)
            {
                // TODO: Handles [out] marshalling only for now

                var stringBuilderType = context.SystemModule.GetKnownType("System.Text", "StringBuilder");
                var charArrayType     = context.GetWellKnownType(WellKnownType.Char).MakeArrayType();

                IL.Stubs.ILLocalVariable vStringBuilder = emitter.NewLocal(stringBuilderType);
                IL.Stubs.ILLocalVariable vBuffer        = emitter.NewLocal(charArrayType);

                marshallingCodeStream.EmitStLoc(vStringBuilder);

                marshallingCodeStream.EmitLdLoc(vStringBuilder);
                marshallingCodeStream.Emit(ILOpcode.call, emitter.NewToken(
                                               context.GetHelperEntryPoint("InteropHelpers", "GetEmptyStringBuilderBuffer")));
                marshallingCodeStream.EmitStLoc(vBuffer);

                unmarshallingCodeStream.EmitLdLoc(vStringBuilder);
                unmarshallingCodeStream.EmitLdLoc(vBuffer);
                unmarshallingCodeStream.Emit(ILOpcode.call, emitter.NewToken(
                                                 context.GetHelperEntryPoint("InteropHelpers", "ReplaceStringBuilderBuffer")));

                marshallingCodeStream.EmitLdLoc(vBuffer);
                return(base.MarshalArgument(charArrayType, emitter, marshallingCodeStream, unmarshallingCodeStream));
            }
            else
            {
                throw new NotSupportedException();
            }
        }
예제 #2
0
파일: Marshaller.cs 프로젝트: SedarG/corert
        protected override void EmitMarshalArgumentManagedToNative()
        {
            ILEmitter         emitter = _ilCodeStreams.Emitter;
            ILCodeStream      marshallingCodeStream   = _ilCodeStreams.MarshallingCodeStream;
            ILCodeStream      unmarshallingCodeStream = _ilCodeStreams.UnmarshallingCodestream;
            TypeSystemContext context = PInvokeMethodData.Context;
            // TODO: Handles [out] marshalling only for now

            var stringBuilderType = context.SystemModule.GetKnownType("System.Text", "StringBuilder");
            var charArrayType     = context.GetWellKnownType(WellKnownType.Char).MakeArrayType();

            IL.Stubs.ILLocalVariable vStringBuilder = emitter.NewLocal(stringBuilderType);
            IL.Stubs.ILLocalVariable vBuffer        = emitter.NewLocal(charArrayType);

            marshallingCodeStream.EmitStLoc(vStringBuilder);

            marshallingCodeStream.EmitLdLoc(vStringBuilder);
            marshallingCodeStream.Emit(ILOpcode.call, emitter.NewToken(
                                           context.GetHelperEntryPoint("InteropHelpers", "GetEmptyStringBuilderBuffer")));
            marshallingCodeStream.EmitStLoc(vBuffer);

            unmarshallingCodeStream.EmitLdLoc(vStringBuilder);
            unmarshallingCodeStream.EmitLdLoc(vBuffer);
            unmarshallingCodeStream.Emit(ILOpcode.call, emitter.NewToken(
                                             context.GetHelperEntryPoint("InteropHelpers", "ReplaceStringBuilderBuffer")));

            marshallingCodeStream.EmitLdLoc(vBuffer);
            ManagedParameterType = charArrayType;
            base.EmitMarshalArgumentManagedToNative();
        }
예제 #3
0
        public static MethodIL EmitIL(MethodDesc methodThatShouldThrow, TypeSystemException exception)
        {
            TypeSystemContext context = methodThatShouldThrow.Context;

            MethodDesc helper;

            Type exceptionType = exception.GetType();

            if (exceptionType == typeof(TypeSystemException.TypeLoadException))
            {
                helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowTypeLoadException");
            }
            else if (exceptionType == typeof(TypeSystemException.MissingFieldException))
            {
                helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowMissingFieldException");
            }
            else if (exceptionType == typeof(TypeSystemException.MissingMethodException))
            {
                helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowMissingMethodException");
            }
            else if (exceptionType == typeof(TypeSystemException.FileNotFoundException))
            {
                helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowFileNotFoundException");
            }
            else if (exceptionType == typeof(TypeSystemException.InvalidProgramException))
            {
                helper = context.GetHelperEntryPoint("ThrowHelpers", "ThrowInvalidProgramException");
            }
            else
            {
                throw new NotImplementedException();
            }

            Debug.Assert(helper.Signature.Length == exception.Arguments.Count + 1);

            var emitter    = new ILEmitter();
            var codeStream = emitter.NewCodeStream();

            var infinityLabel = emitter.NewCodeLabel();

            codeStream.EmitLabel(infinityLabel);

            codeStream.EmitLdc((int)exception.StringID);

            foreach (var arg in exception.Arguments)
            {
                codeStream.Emit(ILOpcode.ldstr, emitter.NewToken(arg));
            }

            codeStream.Emit(ILOpcode.call, emitter.NewToken(helper));

            // The call will never return, but we still need to emit something. Emit a jump so that
            // we don't have to bother balancing the stack if the method returns something.
            codeStream.Emit(ILOpcode.br, infinityLabel);

            return(emitter.Link(methodThatShouldThrow));
        }
예제 #4
0
            protected override TypeGetTypeMethodThunk CreateValueFromKey(Key key)
            {
                TypeSystemContext contex = key.GetTypeOverload.Context;

                // This will be one of the 6 possible overloads:
                // (String), (String, bool), (String, bool, bool)
                // (String, Func<...>, Func<...>), (String, Func<...>, Func<...>, bool), (String, Func<...>, Func<...>, bool, bool)

                // We only need 2 helpers to support this. Use the second parameter to pick the right one.

                string          helperName;
                MethodSignature signature = key.GetTypeOverload.Signature;

                if (signature.Length > 1 && signature[1].HasInstantiation)
                {
                    helperName = "ExtensibleGetType";
                }
                else
                {
                    helperName = "GetType";
                }

                MethodDesc helper = contex.GetHelperEntryPoint("ReflectionHelpers", helperName);

                return(new TypeGetTypeMethodThunk(_parent._owningTypeForThunks, signature, helper, key.DefaultAssemblyName));
            }
        private TypeDesc EmitStringMarshalling()
        {
            if (GetCharSet() == PInvokeAttributes.CharSetUnicode)
            {
                //
                // Unicode marshalling. Pin the string and push a pointer to the first character on the stack.
                //

                TypeDesc stringType = _context.GetWellKnownType(WellKnownType.String);

                ILLocalVariable vPinnedString = _emitter.NewLocal(stringType, true);
                ILCodeLabel     lNullString   = _emitter.NewCodeLabel();

                _marshallingCodeStream.EmitStLoc(vPinnedString);
                _marshallingCodeStream.EmitLdLoc(vPinnedString);

                _marshallingCodeStream.Emit(ILOpcode.conv_i);
                _marshallingCodeStream.Emit(ILOpcode.dup);

                // Marshalling a null string?
                _marshallingCodeStream.Emit(ILOpcode.brfalse, lNullString);

                _marshallingCodeStream.Emit(ILOpcode.call, _emitter.NewToken(
                                                _context.SystemModule.
                                                GetKnownType("System.Runtime.CompilerServices", "RuntimeHelpers").
                                                GetKnownMethod("get_OffsetToStringData", null)));

                _marshallingCodeStream.Emit(ILOpcode.add);

                _marshallingCodeStream.EmitLabel(lNullString);

                return(_context.GetWellKnownType(WellKnownType.IntPtr));
            }
            else
            {
                //
                // ANSI marshalling. Allocate a byte array, copy characters, pin first element.
                //

                var stringToAnsi = _context.GetHelperEntryPoint("InteropHelpers", "StringToAnsi");

                _marshallingCodeStream.Emit(ILOpcode.call, _emitter.NewToken(stringToAnsi));

                return(EmitArrayMarshalling(_context.GetWellKnownType(WellKnownType.Byte).MakeArrayType()));
            }
        }
예제 #6
0
        protected override TypeDesc MarshalArgument(TypeDesc managedType, ILEmitter emitter, ILCodeStream marshallingCodeStream, ILCodeStream unmarshallingCodeStream)
        {
            TypeSystemContext context = PInvokeMethodData.Context;

            if (PInvokeMethodData.GetCharSet() == PInvokeAttributes.CharSetUnicode)
            {
                //
                // Unicode marshalling. Pin the string and push a pointer to the first character on the stack.
                //

                TypeDesc stringType = context.GetWellKnownType(WellKnownType.String);

                IL.Stubs.ILLocalVariable vPinnedString = emitter.NewLocal(stringType, true);
                ILCodeLabel lNullString = emitter.NewCodeLabel();

                marshallingCodeStream.EmitStLoc(vPinnedString);
                marshallingCodeStream.EmitLdLoc(vPinnedString);

                marshallingCodeStream.Emit(ILOpcode.conv_i);
                marshallingCodeStream.Emit(ILOpcode.dup);

                // Marshalling a null string?
                marshallingCodeStream.Emit(ILOpcode.brfalse, lNullString);

                marshallingCodeStream.Emit(ILOpcode.call, emitter.NewToken(
                                               context.SystemModule.
                                               GetKnownType("System.Runtime.CompilerServices", "RuntimeHelpers").
                                               GetKnownMethod("get_OffsetToStringData", null)));

                marshallingCodeStream.Emit(ILOpcode.add);

                marshallingCodeStream.EmitLabel(lNullString);

                return(context.GetWellKnownType(WellKnownType.IntPtr));
            }
            else
            {
                //
                // ANSI marshalling. Allocate a byte array, copy characters, pin first element.
                //

                var stringToAnsi = context.GetHelperEntryPoint("InteropHelpers", "StringToAnsi");

                marshallingCodeStream.Emit(ILOpcode.call, emitter.NewToken(stringToAnsi));

                // Call the Array marshaller MarshalArgument
                return(base.MarshalArgument(context.GetWellKnownType(WellKnownType.Byte).MakeArrayType(), emitter, marshallingCodeStream, unmarshallingCodeStream));
            }
        }
예제 #7
0
파일: Marshaller.cs 프로젝트: SedarG/corert
        protected override void EmitMarshalArgumentManagedToNative()
        {
            ILEmitter         emitter = _ilCodeStreams.Emitter;
            ILCodeStream      marshallingCodeStream = _ilCodeStreams.MarshallingCodeStream;
            TypeSystemContext context = PInvokeMethodData.Context;
            //
            // ANSI marshalling. Allocate a byte array, copy characters, pin first element.
            //

            var stringToAnsi = context.GetHelperEntryPoint("InteropHelpers", "StringToAnsi");

            marshallingCodeStream.Emit(ILOpcode.call, emitter.NewToken(stringToAnsi));

            // Call the Array marshaller MarshalArgument
            ManagedParameterType = context.GetWellKnownType(WellKnownType.Byte).MakeArrayType();
            base.EmitMarshalArgumentManagedToNative();
        }
예제 #8
0
        /// <summary>
        /// Returns JIT helper entrypoint. JIT helpers can be either implemented by entrypoint with given mangled name or
        /// by a method in class library.
        /// </summary>
        public static void GetEntryPoint(TypeSystemContext context, ReadyToRunHelper id, out string mangledName, out MethodDesc methodDesc)
        {
            mangledName = null;
            methodDesc  = null;

            switch (id)
            {
            case ReadyToRunHelper.Throw:
                mangledName = "RhpThrowEx";
                break;

            case ReadyToRunHelper.Rethrow:
                mangledName = "RhpRethrow";
                break;

            case ReadyToRunHelper.Overflow:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowOverflowException");
                break;

            case ReadyToRunHelper.RngChkFail:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowIndexOutOfRangeException");
                break;

            case ReadyToRunHelper.FailFast:
                mangledName = "__fail_fast";     // TODO: Report stack buffer overrun
                break;

            case ReadyToRunHelper.ThrowNullRef:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowNullReferenceException");
                break;

            case ReadyToRunHelper.ThrowDivZero:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowDivideByZeroException");
                break;

            case ReadyToRunHelper.ThrowArgumentOutOfRange:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowArgumentOutOfRangeException");
                break;

            case ReadyToRunHelper.ThrowArgument:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowArgumentException");
                break;

            case ReadyToRunHelper.ThrowPlatformNotSupported:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowPlatformNotSupportedException");
                break;

            case ReadyToRunHelper.ThrowNotImplemented:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowNotImplementedException");
                break;

            case ReadyToRunHelper.DebugBreak:
                mangledName = "RhDebugBreak";
                break;

            case ReadyToRunHelper.WriteBarrier:
                mangledName = "RhpAssignRef";
                break;

            case ReadyToRunHelper.CheckedWriteBarrier:
                mangledName = "RhpCheckedAssignRef";
                break;

            case ReadyToRunHelper.ByRefWriteBarrier:
                mangledName = "RhpByRefAssignRef";
                break;

            case ReadyToRunHelper.Box:
            case ReadyToRunHelper.Box_Nullable:
                mangledName = "RhBox";
                break;

            case ReadyToRunHelper.Unbox:
                mangledName = "RhUnbox2";
                break;

            case ReadyToRunHelper.Unbox_Nullable:
                mangledName = "RhUnboxNullable";
                break;

            case ReadyToRunHelper.NewMultiDimArr_NonVarArg:
                methodDesc = context.GetHelperEntryPoint("ArrayHelpers", "NewObjArray");
                break;

            case ReadyToRunHelper.NewArray:
                mangledName = "RhNewArray";
                break;

            case ReadyToRunHelper.NewObject:
                mangledName = "RhNewObject";
                break;

            case ReadyToRunHelper.Stelem_Ref:
                mangledName = "RhpStelemRef";
                break;

            case ReadyToRunHelper.Ldelema_Ref:
                mangledName = "RhpLdelemaRef";
                break;

            case ReadyToRunHelper.MemCpy:
                mangledName = "memcpy";     // TODO: Null reference handling
                break;

            case ReadyToRunHelper.MemSet:
                mangledName = "memset";     // TODO: Null reference handling
                break;

            case ReadyToRunHelper.GetRuntimeTypeHandle:
                methodDesc = context.GetHelperEntryPoint("LdTokenHelpers", "GetRuntimeTypeHandle");
                break;

            case ReadyToRunHelper.GetRuntimeType:
                methodDesc = context.GetHelperEntryPoint("LdTokenHelpers", "GetRuntimeType");
                break;

            case ReadyToRunHelper.GetRuntimeMethodHandle:
                methodDesc = context.GetHelperEntryPoint("LdTokenHelpers", "GetRuntimeMethodHandle");
                break;

            case ReadyToRunHelper.GetRuntimeFieldHandle:
                methodDesc = context.GetHelperEntryPoint("LdTokenHelpers", "GetRuntimeFieldHandle");
                break;

            case ReadyToRunHelper.AreTypesEquivalent:
                mangledName = "RhTypeCast_AreTypesEquivalent";
                break;

            case ReadyToRunHelper.Lng2Dbl:
                mangledName = "RhpLng2Dbl";
                break;

            case ReadyToRunHelper.ULng2Dbl:
                mangledName = "RhpULng2Dbl";
                break;

            case ReadyToRunHelper.Dbl2Lng:
                mangledName = "RhpDbl2Lng";
                break;

            case ReadyToRunHelper.Dbl2ULng:
                mangledName = "RhpDbl2ULng";
                break;

            case ReadyToRunHelper.Dbl2Int:
                mangledName = "RhpDbl2Int";
                break;

            case ReadyToRunHelper.Dbl2UInt:
                mangledName = "RhpDbl2UInt";
                break;

            case ReadyToRunHelper.Dbl2IntOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2IntOvf");
                break;

            case ReadyToRunHelper.Dbl2UIntOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2UIntOvf");
                break;

            case ReadyToRunHelper.Dbl2LngOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2LngOvf");
                break;

            case ReadyToRunHelper.Dbl2ULngOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2ULngOvf");
                break;

            case ReadyToRunHelper.DblRem:
                mangledName = "RhpDblRem";
                break;

            case ReadyToRunHelper.FltRem:
                mangledName = "RhpFltRem";
                break;

            case ReadyToRunHelper.DblRound:
                mangledName = "RhpDblRound";
                break;

            case ReadyToRunHelper.FltRound:
                mangledName = "RhpFltRound";
                break;

            case ReadyToRunHelper.LMul:
                mangledName = "RhpLMul";
                break;

            case ReadyToRunHelper.LMulOfv:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "LMulOvf");
                break;

            case ReadyToRunHelper.ULMulOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "ULMulOvf");
                break;

            case ReadyToRunHelper.Mod:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "IMod");
                break;

            case ReadyToRunHelper.UMod:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "UMod");
                break;

            case ReadyToRunHelper.ULMod:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "ULMod");
                break;

            case ReadyToRunHelper.LMod:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "LMod");
                break;

            case ReadyToRunHelper.Div:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "IDiv");
                break;

            case ReadyToRunHelper.UDiv:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "UDiv");
                break;

            case ReadyToRunHelper.ULDiv:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "ULDiv");
                break;

            case ReadyToRunHelper.LDiv:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "LDiv");
                break;

            case ReadyToRunHelper.LRsz:
                mangledName = "RhpLRsz";
                break;

            case ReadyToRunHelper.LRsh:
                mangledName = "RhpLRsh";
                break;

            case ReadyToRunHelper.LLsh:
                mangledName = "RhpLLsh";
                break;

            case ReadyToRunHelper.PInvokeBegin:
                mangledName = "RhpPInvoke";
                break;

            case ReadyToRunHelper.PInvokeEnd:
                mangledName = "RhpPInvokeReturn";
                break;

            case ReadyToRunHelper.ReversePInvokeEnter:
                mangledName = "RhpReversePInvoke2";
                break;

            case ReadyToRunHelper.ReversePInvokeExit:
                mangledName = "RhpReversePInvokeReturn2";
                break;

            case ReadyToRunHelper.CheckCastAny:
                mangledName = "RhTypeCast_CheckCast";
                break;

            case ReadyToRunHelper.CheckInstanceAny:
                mangledName = "RhTypeCast_IsInstanceOf";
                break;

            case ReadyToRunHelper.CheckCastInterface:
                mangledName = "RhTypeCast_CheckCastInterface";
                break;

            case ReadyToRunHelper.CheckInstanceInterface:
                mangledName = "RhTypeCast_IsInstanceOfInterface";
                break;

            case ReadyToRunHelper.CheckCastClass:
                mangledName = "RhTypeCast_CheckCastClass";
                break;

            case ReadyToRunHelper.CheckInstanceClass:
                mangledName = "RhTypeCast_IsInstanceOfClass";
                break;

            case ReadyToRunHelper.CheckCastArray:
                mangledName = "RhTypeCast_CheckCastArray";
                break;

            case ReadyToRunHelper.CheckInstanceArray:
                mangledName = "RhTypeCast_IsInstanceOfArray";
                break;

            case ReadyToRunHelper.MonitorEnter:
                methodDesc = context.GetHelperEntryPoint("SynchronizedMethodHelpers", "MonitorEnter");
                break;

            case ReadyToRunHelper.MonitorExit:
                methodDesc = context.GetHelperEntryPoint("SynchronizedMethodHelpers", "MonitorExit");
                break;

            case ReadyToRunHelper.MonitorEnterStatic:
                methodDesc = context.GetHelperEntryPoint("SynchronizedMethodHelpers", "MonitorEnterStatic");
                break;

            case ReadyToRunHelper.MonitorExitStatic:
                methodDesc = context.GetHelperEntryPoint("SynchronizedMethodHelpers", "MonitorExitStatic");
                break;

            case ReadyToRunHelper.GVMLookupForSlot:
                methodDesc = context.SystemModule.GetKnownType("System.Runtime", "TypeLoaderExports").GetKnownMethod("GVMLookupForSlot", null);
                break;

            case ReadyToRunHelper.TypeHandleToRuntimeType:
                methodDesc = context.GetHelperEntryPoint("TypedReferenceHelpers", "TypeHandleToRuntimeTypeMaybeNull");
                break;

            case ReadyToRunHelper.GetRefAny:
                methodDesc = context.GetHelperEntryPoint("TypedReferenceHelpers", "GetRefAny");
                break;

            case ReadyToRunHelper.TypeHandleToRuntimeTypeHandle:
                methodDesc = context.GetHelperEntryPoint("TypedReferenceHelpers", "TypeHandleToRuntimeTypeHandleMaybeNull");
                break;

            default:
                throw new NotImplementedException(id.ToString());
            }
        }
예제 #9
0
        /// <summary>
        /// Returns JIT helper entrypoint. JIT helpers can be either implemented by entrypoint with given mangled name or
        /// by a method in class library.
        /// </summary>
        static public void GetEntryPoint(TypeSystemContext context, JitHelperId id, out string mangledName, out MethodDesc methodDesc)
        {
            mangledName = null;
            methodDesc  = null;

            switch (id)
            {
            case JitHelperId.Throw:
                mangledName = "RhpThrowEx";
                break;

            case JitHelperId.Rethrow:
                mangledName = "RhpRethrow";
                break;

            case JitHelperId.Overflow:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowOverflowException");
                break;

            case JitHelperId.RngChkFail:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowIndexOutOfRangeException");
                break;

            case JitHelperId.FailFast:
                mangledName = "__fail_fast";     // TODO: Report stack buffer overrun
                break;

            case JitHelperId.ThrowNullRef:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowNullReferenceException");
                break;

            case JitHelperId.ThrowDivZero:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowDivideByZeroException");
                break;

            case JitHelperId.WriteBarrier:
                mangledName = "RhpAssignRef";
                break;

            case JitHelperId.CheckedWriteBarrier:
                mangledName = "RhpCheckedAssignRef";
                break;

            case JitHelperId.ByRefWriteBarrier:
                mangledName = "RhpByRefAssignRef";
                break;

            case JitHelperId.Box:
            case JitHelperId.Box_Nullable:
                mangledName = "RhBox";
                break;

            case JitHelperId.Unbox:
                mangledName = "RhUnbox2";
                break;

            case JitHelperId.Unbox_Nullable:
                mangledName = "RhUnboxNullable";
                break;

            case JitHelperId.NewMultiDimArr:
                mangledName = "RhNewMDArray";
                break;

            case JitHelperId.Stelem_Ref:
                mangledName = "RhpStelemRef";
                break;

            case JitHelperId.Ldelema_Ref:
                mangledName = "RhpLdelemaRef";
                break;

            case JitHelperId.MemCpy:
                mangledName = "memcpy";     // TODO: Null reference handling
                break;

            case JitHelperId.MemSet:
                mangledName = "memset";     // TODO: Null reference handling
                break;

            case JitHelperId.GetRuntimeTypeHandle:
                methodDesc = context.GetHelperEntryPoint("LdTokenHelpers", "GetRuntimeTypeHandle");
                break;

            case JitHelperId.GetRuntimeMethodHandle:    // TODO: Reflection
            case JitHelperId.GetRuntimeFieldHandle:     // TODO: Reflection
                mangledName = "__fail_fast";
                break;

            case JitHelperId.Lng2Dbl:
                mangledName = "RhpLng2Dbl";
                break;

            case JitHelperId.ULng2Dbl:
                mangledName = "RhpULng2Dbl";
                break;

            case JitHelperId.Dbl2Lng:
                mangledName = "RhpDbl2Lng";
                break;

            case JitHelperId.Dbl2ULng:
                mangledName = "RhpDbl2ULng";
                break;

            case JitHelperId.Dbl2IntOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2IntOvf");
                break;

            case JitHelperId.Dbl2LngOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2LngOvf");
                break;

            case JitHelperId.Dbl2ULngOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2ULngOvf");
                break;

            default:
                throw new NotImplementedException(id.ToString());
            }
        }
예제 #10
0
        /// <summary>
        /// Returns JIT helper entrypoint. JIT helpers can be either implemented by entrypoint with given mangled name or
        /// by a method in class library.
        /// </summary>
        static public void GetEntryPoint(TypeSystemContext context, ReadyToRunHelper id, out string mangledName, out MethodDesc methodDesc)
        {
            mangledName = null;
            methodDesc  = null;

            switch (id)
            {
            case ReadyToRunHelper.Throw:
                mangledName = "RhpThrowEx";
                break;

            case ReadyToRunHelper.Rethrow:
                mangledName = "RhpRethrow";
                break;

            case ReadyToRunHelper.Overflow:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowOverflowException");
                break;

            case ReadyToRunHelper.RngChkFail:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowIndexOutOfRangeException");
                break;

            case ReadyToRunHelper.FailFast:
                mangledName = "__fail_fast";     // TODO: Report stack buffer overrun
                break;

            case ReadyToRunHelper.ThrowNullRef:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowNullReferenceException");
                break;

            case ReadyToRunHelper.ThrowDivZero:
                methodDesc = context.GetHelperEntryPoint("ThrowHelpers", "ThrowDivideByZeroException");
                break;

            case ReadyToRunHelper.DebugBreak:
                mangledName = "RhDebugBreak";
                break;

            case ReadyToRunHelper.WriteBarrier:
                mangledName = "RhpAssignRef";
                break;

            case ReadyToRunHelper.CheckedWriteBarrier:
                mangledName = "RhpCheckedAssignRef";
                break;

            case ReadyToRunHelper.ByRefWriteBarrier:
                mangledName = "RhpByRefAssignRef";
                break;

            case ReadyToRunHelper.Box:
            case ReadyToRunHelper.Box_Nullable:
                mangledName = "RhBox";
                break;

            case ReadyToRunHelper.Unbox:
                mangledName = "RhUnbox2";
                break;

            case ReadyToRunHelper.Unbox_Nullable:
                mangledName = "RhUnboxNullable";
                break;

            case ReadyToRunHelper.NewMultiDimArr_NonVarArg:
                methodDesc = context.GetHelperEntryPoint("ArrayHelpers", "NewObjArray");
                break;

            case ReadyToRunHelper.Stelem_Ref:
                mangledName = "RhpStelemRef";
                break;

            case ReadyToRunHelper.Ldelema_Ref:
                mangledName = "RhpLdelemaRef";
                break;

            case ReadyToRunHelper.MemCpy:
                mangledName = "memcpy";     // TODO: Null reference handling
                break;

            case ReadyToRunHelper.MemSet:
                mangledName = "memset";     // TODO: Null reference handling
                break;

            case ReadyToRunHelper.GetRuntimeTypeHandle:
                methodDesc = context.GetHelperEntryPoint("LdTokenHelpers", "GetRuntimeTypeHandle");
                break;

            case ReadyToRunHelper.GetRuntimeMethodHandle:    // TODO: Reflection
            case ReadyToRunHelper.GetRuntimeFieldHandle:     // TODO: Reflection
                mangledName = "__fail_fast";
                break;

            case ReadyToRunHelper.Lng2Dbl:
                mangledName = "RhpLng2Dbl";
                break;

            case ReadyToRunHelper.ULng2Dbl:
                mangledName = "RhpULng2Dbl";
                break;

            case ReadyToRunHelper.Dbl2Lng:
                mangledName = "RhpDbl2Lng";
                break;

            case ReadyToRunHelper.Dbl2ULng:
                mangledName = "RhpDbl2ULng";
                break;

            case ReadyToRunHelper.Dbl2IntOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2IntOvf");
                break;

            case ReadyToRunHelper.Dbl2LngOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2LngOvf");
                break;

            case ReadyToRunHelper.Dbl2ULngOvf:
                methodDesc = context.GetHelperEntryPoint("MathHelpers", "Dbl2ULngOvf");
                break;

            case ReadyToRunHelper.DblRem:
                mangledName = "RhpDblRem";
                break;

            case ReadyToRunHelper.FltRem:
                mangledName = "RhpFltRem";
                break;

            case ReadyToRunHelper.PInvokeBegin:
                mangledName = "RhpPInvoke";
                break;

            case ReadyToRunHelper.PInvokeEnd:
                mangledName = "RhpPInvokeReturn";
                break;

            case ReadyToRunHelper.ReversePInvokeEnter:
                mangledName = "RhpReversePInvoke2";
                break;

            case ReadyToRunHelper.ReversePInvokeExit:
                mangledName = "RhpReversePInvokeReturn2";
                break;

            default:
                throw new NotImplementedException(id.ToString());
            }
        }