diff options
author | Michal Strehovský <MichalStrehovsky@users.noreply.github.com> | 2018-05-18 18:23:08 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-18 18:23:08 +0300 |
commit | f563c36911083bca9f919ad9bd2a2e58dc75f95b (patch) | |
tree | 419a7081f550dbc55832e19804eda78455c37f9d /src/ILCompiler.Compiler | |
parent | 3a0d80e3ba2ff7cb524780af27239ccdacb1e37f (diff) | |
parent | 09437ab725ee383805bfee2c600379c8436f26fb (diff) |
Merge pull request #5821 from dotnet/master
Merge master to nmirror
Diffstat (limited to 'src/ILCompiler.Compiler')
3 files changed, 107 insertions, 0 deletions
diff --git a/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.Sorting.cs b/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.Sorting.cs new file mode 100644 index 000000000..67a2b612c --- /dev/null +++ b/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.Sorting.cs @@ -0,0 +1,22 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using Internal.TypeSystem; + +using Debug = System.Diagnostics.Debug; + +namespace Internal.IL.Stubs.StartupCode +{ + partial class AppContextInitializerMethod + { + protected override int ClassCode => 15749517; + + protected override int CompareToImpl(MethodDesc other, TypeSystemComparer comparer) + { + // Should be a singleton + Debug.Assert(this == other); + return 0; + } + } +} diff --git a/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.cs b/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.cs new file mode 100644 index 000000000..2c2d3a51a --- /dev/null +++ b/src/ILCompiler.Compiler/src/IL/Stubs/StartupCode/AppContextInitializerMethod.cs @@ -0,0 +1,83 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System.Collections.Generic; + +using Internal.TypeSystem; + +namespace Internal.IL.Stubs.StartupCode +{ + public sealed partial class AppContextInitializerMethod : ILStubMethod + { + private TypeDesc _owningType; + private MethodSignature _signature; + private IReadOnlyCollection<string> _switches; + + public AppContextInitializerMethod(TypeDesc owningType, IEnumerable<string> switches) + { + _owningType = owningType; + _switches = new List<string>(switches); + } + + public override TypeSystemContext Context + { + get + { + return _owningType.Context; + } + } + + public override TypeDesc OwningType + { + get + { + return _owningType; + } + } + + public override string Name + { + get + { + return "SetAppContextSwitches"; + } + } + + public override MethodIL EmitIL() + { + ILEmitter emitter = new ILEmitter(); + ILCodeStream codeStream = emitter.NewCodeStream(); + + MetadataType appContextType = Context.SystemModule.GetKnownType("System", "AppContext"); + MethodDesc setSwitchMethod = appContextType.GetKnownMethod("SetSwitch", null); + ILToken setSwitchToken = emitter.NewToken(setSwitchMethod); + + foreach (string switchName in _switches) + { + codeStream.Emit(ILOpcode.ldstr, emitter.NewToken(switchName)); + codeStream.EmitLdc(1); + codeStream.Emit(ILOpcode.call, setSwitchToken); + } + + codeStream.Emit(ILOpcode.ret); + + return emitter.Link(this); + } + + public override MethodSignature Signature + { + get + { + if (_signature == null) + { + _signature = new MethodSignature(MethodSignatureFlags.Static, 0, + Context.GetWellKnownType(WellKnownType.Void), + TypeDesc.EmptyTypes); + } + + return _signature; + } + } + } +} diff --git a/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj b/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj index c01786931..a027c66fb 100644 --- a/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj +++ b/src/ILCompiler.Compiler/src/ILCompiler.Compiler.csproj @@ -353,6 +353,8 @@ <Compile Include="Compiler\WindowsNodeMangler.cs" /> <Compile Include="IL\ILImporter.Scanner.cs" /> <Compile Include="IL\Stubs\PInvokeILProvider.cs" /> + <Compile Include="IL\Stubs\StartupCode\AppContextInitializerMethod.cs" /> + <Compile Include="IL\Stubs\StartupCode\AppContextInitializerMethod.Sorting.cs" /> <Compile Include="IL\Stubs\StartupCode\StartupCodeMainMethod.cs" /> <Compile Include="IL\Stubs\StartupCode\StartupCodeMainMethod.Sorting.cs" /> <Compile Include="IL\Stubs\StartupCode\NativeLibraryStartupMethod.cs" /> |