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(); } }
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(); }
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)); }
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())); } }
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)); } }
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(); }
/// <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()); } }
/// <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()); } }
/// <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()); } }