| File: Compiler\BodySubstitution.cs | Web Access |
| Project: src\runtime\src\coreclr\tools\aot\ILCompiler.Compiler\ILCompiler.Compiler.csproj (ILCompiler.Compiler) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Diagnostics; using Internal.IL; using Internal.IL.Stubs; using Internal.TypeSystem; namespace ILCompiler { public sealed class BodySubstitution { private object _value; private static readonly object Throw = new object(); public static readonly BodySubstitution ThrowingBody = new BodySubstitution(Throw); public static readonly BodySubstitution EmptyBody = new BodySubstitution(null); public object Value { get { Debug.Assert(_value != Throw); return _value; } } private BodySubstitution(object value) => _value = value; public static BodySubstitution Create(object value) => new BodySubstitution(value); public MethodIL EmitIL(MethodDesc method) { ILEmitter emit = new ILEmitter(); ILCodeStream codestream = emit.NewCodeStream(); if (_value == Throw) { codestream.EmitCallThrowHelper(emit, method.Context.GetHelperEntryPoint("ThrowHelpers"u8, "ThrowFeatureBodyRemoved"u8)); } else if (_value == null) { Debug.Assert(method.Signature.ReturnType.IsVoid); codestream.Emit(ILOpcode.ret); } else { Debug.Assert(_value is int); codestream.EmitLdc((int)_value); codestream.Emit(ILOpcode.ret); } return emit.Link(method); } } }