From d45ba3717a9fcde15faab070813183e07a764c6f Mon Sep 17 00:00:00 2001 From: Nyerst Date: Tue, 15 Mar 2022 20:08:06 +0800 Subject: [PATCH 01/12] ILEmit --- .../CodeGenerators/FastNewCoreGenerator.cs | 154 +++--- .../CodeGenerators/ThrowHelperGenerator.cs | 9 +- .../GeneratorOptions.cs | 3 - .../Utilities/CodeBuilder.Misc.cs | 1 + .../Utilities/CodeBuilder.cs | 12 + FastGenericNew/FastGenericNew.csproj | 8 +- .../ConstructorCache.g.cs | 321 ------------ .../FastNew.CreateInstance.g.cs | 1 + .../FastNew.TryCreateInstance.g.cs | 1 + .../FastNew{T}.g.cs | 484 +++++++++--------- .../ThrowHelper.g.cs | 8 +- .../TypeNew.CreateInstance.g.cs | 1 + .../_GenerationInfo.g.cs | 6 +- 13 files changed, 340 insertions(+), 669 deletions(-) delete mode 100644 FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ConstructorCache.g.cs diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs index 9394cfe..73a4d46 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs @@ -21,37 +21,52 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) builder.StartNamespace(); builder.Indent(1); builder.AppendAccessibility(options.PublicFastNewCore); - builder.AppendLine(@$"static partial class FastNew< + + #region Get CompiledDelegateName Type + string compiledDelegateTypeNoParam; + { + CodeBuilder internalBuilder = new(32, in options); + internalBuilder.UseGenericDelegate(0); + compiledDelegateTypeNoParam = internalBuilder.ToString(); + } + #endregion + + builder.AppendLine(@$"static partial class {ClassName}< #if NET5_0_OR_GREATER {options.DynamicallyAccessedMembers(0)} #endif T> {{ + /// + /// The constructor of with given arguments.
+ /// Could be if the constructor couldn't be found. + ///
+ public static readonly ConstructorInfo? {ConsructorName} = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); + #if NETFRAMEWORK [EditorBrowsable(EditorBrowsableState.Never)] internal static readonly bool _isValueTypeT = typeof(T).IsValueType; #endif - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? {ConsructorName} = typeof(T).GetConstructor({(options.NonPublicConstructorSupport - ? "BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic" - : "BindingFlags.Instance | BindingFlags.Public")}, null, Type.EmptyTypes, null); - - {(options.PublicSourceExpression ? "public" : "internal")} static readonly System.Linq.Expressions.Expression> SourceExpression = System.Linq.Expressions.Expression.Lambda>(typeof(T).IsValueType - ? ({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New({options.GlobalNSDot()}{ClassName}.{ConsructorName}) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(typeof(T))) - : (({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null && !typeof(T).IsAbstract) - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New({options.GlobalNSDot()}{ClassName}.{ConsructorName}) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call({options.GlobalNSDot()}{ThrowHelperGenerator.ClassName}.GetSmartThrow(), System.Linq.Expressions.Expression.Constant({options.GlobalNSDot()}{ClassName}.{ConsructorName}, typeof(ConstructorInfo)))) - , Array.Empty()); - - {(options.PublicCompiledDelegate ? "public" : "internal")} static readonly Func {CompiledDelegateName} = SourceExpression.Compile(); + {(options.PublicCompiledDelegate ? "public" : "internal")} static readonly {compiledDelegateTypeNoParam} {CompiledDelegateName}; public static readonly bool {IsValidName} = typeof(T).IsValueType || ({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null && !typeof(T).IsAbstract); + + static {ClassName}() + {{ + var dm = new DynamicMethod("""", typeof(T), null, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(6); + if ({IsValidName}) + {{ + il.Emit(OpCodes.Newobj, {ConsructorName}); + }} + else + {{ + il.Emit(OpCodes.Call, {options.GlobalNSDot()}{ThrowHelperGenerator.ClassName}.GetSmartThrow()); + }} + il.Emit(OpCodes.Ret); + {CompiledDelegateName} = ({compiledDelegateTypeNoParam})dm.CreateDelegate(typeof({compiledDelegateTypeNoParam})); + }} }}"); for (int parameterIndex = 1; parameterIndex <= options.MaxParameterCount; parameterIndex++) @@ -103,13 +118,6 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) builder.AppendLine(", null);"); #endregion - builder.Indent(2); - builder.AppendAccessibility(options.PublicSourceExpression); - builder.Append("static readonly System.Linq.Expressions.Expression<"); - builder.UseGenericDelegate(parameterIndex); - builder.AppendLine("> SourceExpression;"); - builder.PrettyNewLine(); - builder.Indent(2); builder.AppendAccessibility(options.PublicCompiledDelegate); builder.Append("static readonly "); @@ -123,77 +131,58 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) #region Constructor builder.Indent(2); - builder.AppendLine("static FastNew()"); + builder.AppendLine($"static {ClassName}()"); builder.StartBlock(2); - /* - #region Var constructor - builder.Indent(3); - builder.Append("var constructor = "); - builder.GlobalNamespaceDot(); - builder.Append(ClassName); - builder.UseGenericMember(parameterIndex); - builder.AppendLine($".{ConsructorName};"); - #endregion - */ - #region IsValid - builder.Indent(3); - builder.AppendLine($"IsValid = {ConsructorName} != null && !typeof(T).IsAbstract;"); - #endregion - - #region Parameters - for (int i = 0; i < parameterIndex; i++) - { - builder.Indent(3); - builder.Append("var "); - builder.AppendGenericMethodArgumentName(i); - builder.Append(" = System.Linq.Expressions.Expression.Parameter(typeof("); - builder.AppendGenericArgumentName(i); - builder.Append("));\n"); - } + builder.AppendLine(3, $"IsValid = {ConsructorName} != null && !typeof(T).IsAbstract;"); #endregion #region Final - builder.Indent(3); - builder.Append($"{CompiledDelegateName} = (SourceExpression = System.Linq.Expressions.Expression.Lambda<"); - builder.UseGenericDelegate(parameterIndex); - builder.AppendLine($">({IsValidName}"); - - builder.Indent(4); - builder.Append($"? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New({ConsructorName}!"); - /* - builder.GlobalNamespaceDot(); - builder.Append(ConstructorOfGenerator.ClassName); - builder.UseGenericMember(parameterIndex); - builder.Append($".{ConstructorOfGenerator.ValueName}"); - */ + builder.Append(3, "var dm = new DynamicMethod(\"\", typeof(T), new Type[] { "); for (int i = 0; i < parameterIndex; i++) { - builder.Append(',', ' '); - builder.AppendGenericMethodArgumentName(i); + if (i != 0) + { + builder.Append(',', ' '); + } + builder.Append("typeof("); + builder.AppendGenericArgumentName(i); + builder.Append(')'); } - builder.AppendLine(')'); - - builder.Indent(4); - builder.Append(": (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call("); - builder.GlobalNamespaceDot(); - builder.Append($"{ThrowHelperGenerator.ClassName}.GetSmartThrow(), "); - builder.Append($"System.Linq.Expressions.Expression.Constant({ConsructorName}, typeof(ConstructorInfo))"); - builder.AppendLine(')'); + builder.Append(' ', '}'); + builder.AppendLine(@", restrictedSkipVisibility: true);"); + // 5 = Newobj + Ret + // +4 is required because EnsureCapacity() in il.Emit needs at least 3 bytes more available in buffer. + // TODO: more optimization is needed here. + builder.AppendLine(3, $"var il = dm.GetILGenerator({5 + parameterIndex + 4});"); - builder.Indent(3); - builder.Append(", new System.Linq.Expressions.ParameterExpression[] { "); + #region Parameters for (int i = 0; i < parameterIndex; i++) { - if (i != 0) + builder.Append(3, "il.Emit("); + builder.Append(i switch { - builder.Append(',', ' '); - } - builder.AppendGenericMethodArgumentName(i); + 0 => "OpCodes.Ldarg_0", + 1 => "OpCodes.Ldarg_1", + 2 => "OpCodes.Ldarg_2", + 3 => "OpCodes.Ldarg_3", + _ when i <= 255 => $"OpCodes.Ldarg_S, (byte){i}", + _ => $"OpCodes.Ldarg, (short){i}", + }); + builder.Append(')', ';'); + builder.AppendLine(); } - builder.AppendLine(" })).Compile();"); + #endregion + builder.AppendLine(3, $"il.Emit(OpCodes.Newobj, {ConsructorName});"); + builder.AppendLine(3, "il.Emit(OpCodes.Ret);"); + builder.Append(3, CompiledDelegateName); + builder.Append(" = ("); + builder.UseGenericDelegate(parameterIndex); + builder.Append(")dm.CreateDelegate(typeof("); + builder.UseGenericDelegate(parameterIndex); + builder.AppendLine("));"); #endregion builder.EndBlock(2); @@ -210,6 +199,5 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) public override bool ShouldUpdate(in GeneratorOptions oldValue, in GeneratorOptions newValue) => base.ShouldUpdate(oldValue, newValue) || oldValue.ForceFastNewDelegate != newValue.ForceFastNewDelegate - || oldValue.PublicSourceExpression != newValue.PublicSourceExpression || oldValue.PublicCompiledDelegate != newValue.PublicCompiledDelegate; } \ No newline at end of file diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/ThrowHelperGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/ThrowHelperGenerator.cs index 468a31b..89b96e4 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/ThrowHelperGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/ThrowHelperGenerator.cs @@ -6,6 +6,8 @@ public class ThrowHelperGenerator : CodeGenerator internal const string ClassName = "ThrowHelper"; + internal const string SmartThrowName = "SmartThrowImpl"; + public override CodeGenerationResult Generate(in GeneratorOptions options) { CodeBuilder builder = new(2048, in options); @@ -24,7 +26,7 @@ internal static partial class ThrowHelper builder.AppendLine(@$" public static System.Reflection.MethodInfo GetSmartThrow() => typeof({options.GlobalNSDot()}ThrowHelper).GetMethod(""SmartThrowImpl"", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static)!.MakeGenericMethod(typeof(T)); - public static T SmartThrowImpl(ConstructorInfo? constructor) + public static T SmartThrowImpl() {{ if (typeof(T).IsInterface) throw new System.MissingMethodException($""Cannot create an instance of an interface: '{{typeof(T).AssemblyQualifiedName}}'""); @@ -32,10 +34,7 @@ public static T SmartThrowImpl(ConstructorInfo? constructor) if (typeof(T).IsAbstract) throw new System.MissingMethodException($""Cannot create an abstract class: '{{typeof(T).AssemblyQualifiedName}}'""); - if (constructor == null && !typeof(T).IsValueType) - throw new System.MissingMethodException($""No match constructor found in type: '{{typeof(T).AssemblyQualifiedName}}'""); - - throw new System.MissingMethodException($""Unknown Error""); + throw new System.MissingMethodException($""No match constructor found in type: '{{typeof(T).AssemblyQualifiedName}}'""); }} }}"); builder.EndNamespace(); diff --git a/FastGenericNew.SourceGenerator/GeneratorOptions.cs b/FastGenericNew.SourceGenerator/GeneratorOptions.cs index 17b1752..96ababf 100644 --- a/FastGenericNew.SourceGenerator/GeneratorOptions.cs +++ b/FastGenericNew.SourceGenerator/GeneratorOptions.cs @@ -6,8 +6,6 @@ public readonly record struct GeneratorOptions public bool PublicFastNewCore { get; } - public bool PublicSourceExpression { get; } - public bool GenerateTryCreateInstance { get; } //public bool GenerateTypeTryCreateInstance { get; } @@ -44,7 +42,6 @@ public GeneratorOptions(AnalyzerConfigOptionsProvider? provider) GenerateTryCreateInstance = options.GetOrDefault(nameof(GenerateTryCreateInstance), true); GenerateCreateInstance = options.GetOrDefault(nameof(GenerateCreateInstance), true); - PublicSourceExpression = options.GetOrDefault(nameof(PublicSourceExpression), false); PublicCompiledDelegate = options.GetOrDefault(nameof(PublicCompiledDelegate), true); NonPublicConstructorSupport = options.GetOrDefault(nameof(NonPublicConstructorSupport), true); Namespace = options.GetOrDefault(nameof(Namespace), "FastGenericNew"); diff --git a/FastGenericNew.SourceGenerator/Utilities/CodeBuilder.Misc.cs b/FastGenericNew.SourceGenerator/Utilities/CodeBuilder.Misc.cs index 1dabfab..77a4c8f 100644 --- a/FastGenericNew.SourceGenerator/Utilities/CodeBuilder.Misc.cs +++ b/FastGenericNew.SourceGenerator/Utilities/CodeBuilder.Misc.cs @@ -20,6 +20,7 @@ public void WriteFileHeader() using System.Runtime.CompilerServices; using System.Diagnostics.CodeAnalysis; using System.Reflection; +using System.Reflection.Emit; using System.ComponentModel; "); } diff --git a/FastGenericNew.SourceGenerator/Utilities/CodeBuilder.cs b/FastGenericNew.SourceGenerator/Utilities/CodeBuilder.cs index cc64e55..0a87553 100644 --- a/FastGenericNew.SourceGenerator/Utilities/CodeBuilder.cs +++ b/FastGenericNew.SourceGenerator/Utilities/CodeBuilder.cs @@ -163,6 +163,12 @@ public void Append(char value, char value2) _length += 2; } + public void Append(int indent, string value) + { + Indent(indent); + Append(value.AsSpan()); + } + public void Append(string value) => Append(value.AsSpan()); [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -187,6 +193,12 @@ public void AppendLine(char value) _length += 2; } + public void AppendLine(int indent, string value) + { + Indent(indent); + AppendLine(value.AsSpan()); + } + public void AppendLine(string value) => AppendLine(value.AsSpan()); public void AppendLine(ReadOnlySpan value) diff --git a/FastGenericNew/FastGenericNew.csproj b/FastGenericNew/FastGenericNew.csproj index 84ee37f..d365567 100644 --- a/FastGenericNew/FastGenericNew.csproj +++ b/FastGenericNew/FastGenericNew.csproj @@ -5,7 +5,7 @@ net6.0;netstandard2.0;netstandard2.1;net5.0 $(TargetFrameworks);net461 8.0 - enabled + disabled enable true true @@ -39,9 +39,13 @@ - + + + + + diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ConstructorCache.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ConstructorCache.g.cs deleted file mode 100644 index 4327d27..0000000 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ConstructorCache.g.cs +++ /dev/null @@ -1,321 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by FastGenericNew.SourceGenerator -// Please do not modify this file directly -// -//------------------------------------------------------------------------------ -#nullable enable -using System; -using System.Collections.Generic; -using System.Runtime.CompilerServices; -using System.Diagnostics.CodeAnalysis; -using System.Reflection; -using System.ComponentModel; - -namespace @FastGenericNew -{ - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - typeof(TArg6), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - typeof(TArg6), - typeof(TArg7), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - typeof(TArg6), - typeof(TArg7), - typeof(TArg8), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - typeof(TArg6), - typeof(TArg7), - typeof(TArg8), - typeof(TArg9), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - typeof(TArg6), - typeof(TArg7), - typeof(TArg8), - typeof(TArg9), - typeof(TArg10), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - typeof(TArg6), - typeof(TArg7), - typeof(TArg8), - typeof(TArg9), - typeof(TArg10), - typeof(TArg11), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - typeof(TArg6), - typeof(TArg7), - typeof(TArg8), - typeof(TArg9), - typeof(TArg10), - typeof(TArg11), - typeof(TArg12), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - typeof(TArg6), - typeof(TArg7), - typeof(TArg8), - typeof(TArg9), - typeof(TArg10), - typeof(TArg11), - typeof(TArg12), - typeof(TArg13), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - typeof(TArg6), - typeof(TArg7), - typeof(TArg8), - typeof(TArg9), - typeof(TArg10), - typeof(TArg11), - typeof(TArg12), - typeof(TArg13), - typeof(TArg14), - }, null); - } - partial class FastNew - { - /// - /// The constructor of with given arguments.
- /// Could be if the constructor couldn't be found. - ///
- public static readonly ConstructorInfo? Constructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] - { - typeof(TArg0), - typeof(TArg1), - typeof(TArg2), - typeof(TArg3), - typeof(TArg4), - typeof(TArg5), - typeof(TArg6), - typeof(TArg7), - typeof(TArg8), - typeof(TArg9), - typeof(TArg10), - typeof(TArg11), - typeof(TArg12), - typeof(TArg13), - typeof(TArg14), - typeof(TArg15), - }, null); - } -} diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew.CreateInstance.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew.CreateInstance.g.cs index 51b4f19..6fab1ce 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew.CreateInstance.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew.CreateInstance.g.cs @@ -10,6 +10,7 @@ using System.Runtime.CompilerServices; using System.Diagnostics.CodeAnalysis; using System.Reflection; +using System.Reflection.Emit; using System.ComponentModel; namespace @FastGenericNew diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew.TryCreateInstance.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew.TryCreateInstance.g.cs index 622056a..5682244 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew.TryCreateInstance.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew.TryCreateInstance.g.cs @@ -10,6 +10,7 @@ using System.Runtime.CompilerServices; using System.Diagnostics.CodeAnalysis; using System.Reflection; +using System.Reflection.Emit; using System.ComponentModel; namespace @FastGenericNew diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs index 58c3eaf..972c1fd 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs @@ -10,6 +10,7 @@ using System.Runtime.CompilerServices; using System.Diagnostics.CodeAnalysis; using System.Reflection; +using System.Reflection.Emit; using System.ComponentModel; namespace @FastGenericNew @@ -20,29 +21,36 @@ internal static partial class FastNew< #endif T> { -#if NETFRAMEWORK - [EditorBrowsable(EditorBrowsableState.Never)] - internal static readonly bool _isValueTypeT = typeof(T).IsValueType; -#endif - /// /// The constructor of with given arguments.
/// Could be if the constructor couldn't be found. ///
public static readonly ConstructorInfo? CachedConstructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression = System.Linq.Expressions.Expression.Lambda>(typeof(T).IsValueType - ? (global::@FastGenericNew.FastNew.CachedConstructor != null - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(global::@FastGenericNew.FastNew.CachedConstructor) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(typeof(T))) - : ((global::@FastGenericNew.FastNew.CachedConstructor != null && !typeof(T).IsAbstract) - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(global::@FastGenericNew.FastNew.CachedConstructor) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(global::@FastGenericNew.FastNew.CachedConstructor, typeof(ConstructorInfo)))) - , Array.Empty()); +#if NETFRAMEWORK + [EditorBrowsable(EditorBrowsableState.Never)] + internal static readonly bool _isValueTypeT = typeof(T).IsValueType; +#endif - public static readonly Func CompiledDelegate = SourceExpression.Compile(); + public static readonly Func CompiledDelegate; public static readonly bool IsValid = typeof(T).IsValueType || (global::@FastGenericNew.FastNew.CachedConstructor != null && !typeof(T).IsAbstract); + + static FastNew() + { + var dm = new DynamicMethod("", typeof(T), null, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(6); + if (IsValid) + { + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + } } internal static partial class FastNew< #if NET5_0_OR_GREATER @@ -58,8 +66,6 @@ internal static partial class FastNew< { typeof(TArg0), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -67,11 +73,12 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(10); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -89,8 +96,6 @@ internal static partial class FastNew< typeof(TArg0), typeof(TArg1), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -98,12 +103,13 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(11); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -122,8 +128,6 @@ internal static partial class FastNew< typeof(TArg1), typeof(TArg2), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -131,13 +135,14 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(12); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -157,8 +162,6 @@ internal static partial class FastNew< typeof(TArg2), typeof(TArg3), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -166,14 +169,15 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(13); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -194,8 +198,6 @@ internal static partial class FastNew< typeof(TArg3), typeof(TArg4), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -203,15 +205,16 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(14); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -233,8 +236,6 @@ internal static partial class FastNew< typeof(TArg4), typeof(TArg5), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -242,16 +243,17 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(15); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -274,8 +276,6 @@ internal static partial class FastNew< typeof(TArg5), typeof(TArg6), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -283,17 +283,18 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(16); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -317,8 +318,6 @@ internal static partial class FastNew< typeof(TArg6), typeof(TArg7), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -326,18 +325,19 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); - var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(17); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -362,8 +362,6 @@ internal static partial class FastNew< typeof(TArg7), typeof(TArg8), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -371,19 +369,20 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); - var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); - var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(18); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -409,8 +408,6 @@ internal static partial class FastNew< typeof(TArg8), typeof(TArg9), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -418,20 +415,21 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); - var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); - var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); - var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(19); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -458,8 +456,6 @@ internal static partial class FastNew< typeof(TArg9), typeof(TArg10), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -467,21 +463,22 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); - var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); - var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); - var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); - var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(20); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -509,8 +506,6 @@ internal static partial class FastNew< typeof(TArg10), typeof(TArg11), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -518,22 +513,23 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); - var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); - var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); - var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); - var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); - var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(21); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -562,8 +558,6 @@ internal static partial class FastNew< typeof(TArg11), typeof(TArg12), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -571,23 +565,24 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); - var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); - var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); - var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); - var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); - var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); - var p12 = System.Linq.Expressions.Expression.Parameter(typeof(TArg12)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(22); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Ldarg_S, (byte)12); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -617,8 +612,6 @@ internal static partial class FastNew< typeof(TArg12), typeof(TArg13), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -626,24 +619,25 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); - var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); - var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); - var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); - var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); - var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); - var p12 = System.Linq.Expressions.Expression.Parameter(typeof(TArg12)); - var p13 = System.Linq.Expressions.Expression.Parameter(typeof(TArg13)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(23); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Ldarg_S, (byte)12); + il.Emit(OpCodes.Ldarg_S, (byte)13); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -674,8 +668,6 @@ internal static partial class FastNew< typeof(TArg13), typeof(TArg14), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -683,25 +675,26 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); - var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); - var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); - var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); - var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); - var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); - var p12 = System.Linq.Expressions.Expression.Parameter(typeof(TArg12)); - var p13 = System.Linq.Expressions.Expression.Parameter(typeof(TArg13)); - var p14 = System.Linq.Expressions.Expression.Parameter(typeof(TArg14)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(24); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Ldarg_S, (byte)12); + il.Emit(OpCodes.Ldarg_S, (byte)13); + il.Emit(OpCodes.Ldarg_S, (byte)14); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } internal static partial class FastNew< @@ -733,8 +726,6 @@ internal static partial class FastNew< typeof(TArg14), typeof(TArg15), }, null); - public static readonly System.Linq.Expressions.Expression> SourceExpression; - public static readonly Func CompiledDelegate; public static readonly bool IsValid; @@ -742,26 +733,27 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); - var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); - var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); - var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); - var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); - var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); - var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); - var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); - var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); - var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); - var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); - var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); - var p12 = System.Linq.Expressions.Expression.Parameter(typeof(TArg12)); - var p13 = System.Linq.Expressions.Expression.Parameter(typeof(TArg13)); - var p14 = System.Linq.Expressions.Expression.Parameter(typeof(TArg14)); - var p15 = System.Linq.Expressions.Expression.Parameter(typeof(TArg15)); - CompiledDelegate = (SourceExpression = System.Linq.Expressions.Expression.Lambda>(IsValid - ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) - , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 })).Compile(); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14), typeof(TArg15) }, restrictedSkipVisibility: true); + var il = dm.GetILGenerator(25); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Ldarg_S, (byte)12); + il.Emit(OpCodes.Ldarg_S, (byte)13); + il.Emit(OpCodes.Ldarg_S, (byte)14); + il.Emit(OpCodes.Ldarg_S, (byte)15); + il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } } } diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ThrowHelper.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ThrowHelper.g.cs index 4f9ba1d..dc86e84 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ThrowHelper.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ThrowHelper.g.cs @@ -10,6 +10,7 @@ using System.Runtime.CompilerServices; using System.Diagnostics.CodeAnalysis; using System.Reflection; +using System.Reflection.Emit; using System.ComponentModel; namespace @FastGenericNew @@ -26,7 +27,7 @@ internal static partial class ThrowHelper public static System.Reflection.MethodInfo GetSmartThrow() => typeof(global::@FastGenericNew.ThrowHelper).GetMethod("SmartThrowImpl", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static)!.MakeGenericMethod(typeof(T)); - public static T SmartThrowImpl(ConstructorInfo? constructor) + public static T SmartThrowImpl() { if (typeof(T).IsInterface) throw new System.MissingMethodException($"Cannot create an instance of an interface: '{typeof(T).AssemblyQualifiedName}'"); @@ -34,10 +35,7 @@ public static T SmartThrowImpl(ConstructorInfo? constructor) if (typeof(T).IsAbstract) throw new System.MissingMethodException($"Cannot create an abstract class: '{typeof(T).AssemblyQualifiedName}'"); - if (constructor == null && !typeof(T).IsValueType) - throw new System.MissingMethodException($"No match constructor found in type: '{typeof(T).AssemblyQualifiedName}'"); - - throw new System.MissingMethodException($"Unknown Error"); + throw new System.MissingMethodException($"No match constructor found in type: '{typeof(T).AssemblyQualifiedName}'"); } } } diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/TypeNew.CreateInstance.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/TypeNew.CreateInstance.g.cs index 0752037..af59c82 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/TypeNew.CreateInstance.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/TypeNew.CreateInstance.g.cs @@ -10,6 +10,7 @@ using System.Runtime.CompilerServices; using System.Diagnostics.CodeAnalysis; using System.Reflection; +using System.Reflection.Emit; using System.ComponentModel; namespace @FastGenericNew diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/_GenerationInfo.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/_GenerationInfo.g.cs index 62748ce..b535298 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/_GenerationInfo.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/_GenerationInfo.g.cs @@ -9,7 +9,6 @@ MaxParameterCount = 16 PublicFastNewCore = False - PublicSourceExpression = True (default: False) GenerateTryCreateInstance = True GenerateCreateInstance = True GenerateTypeCreateInstance = True @@ -17,7 +16,7 @@ NonPublicConstructorSupport = True Namespace = FastGenericNew ForceFastNewDelegate = False - IsGeneratedHeader = True + AlertGeneratedFile = True DisableGeneratorCache = False Trimmable = True PrettyOutput = True (default: False) @@ -29,7 +28,6 @@ 16 False - True True True True @@ -37,7 +35,7 @@ True FastGenericNew False - True + True False True True From a801489ed304e37633b2f63dfde05e71096069ea Mon Sep 17 00:00:00 2001 From: Nyerst Date: Tue, 15 Mar 2022 20:21:57 +0800 Subject: [PATCH 02/12] SmartThrow for CreateInstance with parameters --- .../CodeGenerators/FastNewCoreGenerator.cs | 13 +- .../FastNew{T}.g.cs | 416 +++++++++++------- 2 files changed, 275 insertions(+), 154 deletions(-) diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs index 73a4d46..d59f718 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs @@ -157,10 +157,12 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) // TODO: more optimization is needed here. builder.AppendLine(3, $"var il = dm.GetILGenerator({5 + parameterIndex + 4});"); + builder.AppendLine(3, $"if ({IsValidName})"); + builder.AppendLine(3, $"{{"); #region Parameters for (int i = 0; i < parameterIndex; i++) { - builder.Append(3, "il.Emit("); + builder.Append(4, "il.Emit("); builder.Append(i switch { 0 => "OpCodes.Ldarg_0", @@ -174,7 +176,14 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) builder.AppendLine(); } #endregion - builder.AppendLine(3, $"il.Emit(OpCodes.Newobj, {ConsructorName});"); + builder.AppendLine(4, $"il.Emit(OpCodes.Newobj, {ConsructorName});"); + + builder.AppendLine(3, $"}}"); + builder.AppendLine(3, $"else"); + builder.AppendLine(3, $"{{"); + builder.AppendLine(4, $"il.Emit(OpCodes.Call, {options.GlobalNSDot()}{ThrowHelperGenerator.ClassName}.GetSmartThrow());"); + builder.AppendLine(3, $"}}"); + builder.AppendLine(3, "il.Emit(OpCodes.Ret);"); builder.Append(3, CompiledDelegateName); diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs index 972c1fd..6fc2aba 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs @@ -75,8 +75,15 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(10); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -105,9 +112,16 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(11); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -137,10 +151,17 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(12); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -171,11 +192,18 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(13); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -207,12 +235,19 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(14); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -245,13 +280,20 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(15); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -285,14 +327,21 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(16); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -327,15 +376,22 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(17); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Ldarg_S, (byte)7); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -371,16 +427,23 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(18); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Ldarg_S, (byte)7); - il.Emit(OpCodes.Ldarg_S, (byte)8); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -417,17 +480,24 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(19); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Ldarg_S, (byte)7); - il.Emit(OpCodes.Ldarg_S, (byte)8); - il.Emit(OpCodes.Ldarg_S, (byte)9); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -465,18 +535,25 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(20); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Ldarg_S, (byte)7); - il.Emit(OpCodes.Ldarg_S, (byte)8); - il.Emit(OpCodes.Ldarg_S, (byte)9); - il.Emit(OpCodes.Ldarg_S, (byte)10); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -515,19 +592,26 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(21); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Ldarg_S, (byte)7); - il.Emit(OpCodes.Ldarg_S, (byte)8); - il.Emit(OpCodes.Ldarg_S, (byte)9); - il.Emit(OpCodes.Ldarg_S, (byte)10); - il.Emit(OpCodes.Ldarg_S, (byte)11); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -567,20 +651,27 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(22); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Ldarg_S, (byte)7); - il.Emit(OpCodes.Ldarg_S, (byte)8); - il.Emit(OpCodes.Ldarg_S, (byte)9); - il.Emit(OpCodes.Ldarg_S, (byte)10); - il.Emit(OpCodes.Ldarg_S, (byte)11); - il.Emit(OpCodes.Ldarg_S, (byte)12); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Ldarg_S, (byte)12); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -621,21 +712,28 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(23); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Ldarg_S, (byte)7); - il.Emit(OpCodes.Ldarg_S, (byte)8); - il.Emit(OpCodes.Ldarg_S, (byte)9); - il.Emit(OpCodes.Ldarg_S, (byte)10); - il.Emit(OpCodes.Ldarg_S, (byte)11); - il.Emit(OpCodes.Ldarg_S, (byte)12); - il.Emit(OpCodes.Ldarg_S, (byte)13); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Ldarg_S, (byte)12); + il.Emit(OpCodes.Ldarg_S, (byte)13); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -677,22 +775,29 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(24); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Ldarg_S, (byte)7); - il.Emit(OpCodes.Ldarg_S, (byte)8); - il.Emit(OpCodes.Ldarg_S, (byte)9); - il.Emit(OpCodes.Ldarg_S, (byte)10); - il.Emit(OpCodes.Ldarg_S, (byte)11); - il.Emit(OpCodes.Ldarg_S, (byte)12); - il.Emit(OpCodes.Ldarg_S, (byte)13); - il.Emit(OpCodes.Ldarg_S, (byte)14); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Ldarg_S, (byte)12); + il.Emit(OpCodes.Ldarg_S, (byte)13); + il.Emit(OpCodes.Ldarg_S, (byte)14); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } @@ -735,23 +840,30 @@ static FastNew() IsValid = CachedConstructor != null && !typeof(T).IsAbstract; var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14), typeof(TArg15) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(25); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Ldarg_S, (byte)7); - il.Emit(OpCodes.Ldarg_S, (byte)8); - il.Emit(OpCodes.Ldarg_S, (byte)9); - il.Emit(OpCodes.Ldarg_S, (byte)10); - il.Emit(OpCodes.Ldarg_S, (byte)11); - il.Emit(OpCodes.Ldarg_S, (byte)12); - il.Emit(OpCodes.Ldarg_S, (byte)13); - il.Emit(OpCodes.Ldarg_S, (byte)14); - il.Emit(OpCodes.Ldarg_S, (byte)15); - il.Emit(OpCodes.Newobj, CachedConstructor); + if (IsValid) + { + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Ldarg_S, (byte)12); + il.Emit(OpCodes.Ldarg_S, (byte)13); + il.Emit(OpCodes.Ldarg_S, (byte)14); + il.Emit(OpCodes.Ldarg_S, (byte)15); + il.Emit(OpCodes.Newobj, CachedConstructor); + } + else + { + il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); + } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); } From 142ff0ad72b8eaea352d0050e9a871e1da47e5a3 Mon Sep 17 00:00:00 2001 From: Nyerst Date: Tue, 15 Mar 2022 20:37:32 +0800 Subject: [PATCH 03/12] All tests passed --- .../CodeGenerators/FastNewCoreGenerator.cs | 10 +++++++++- .../FastNew{T}.g.cs | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs index d59f718..3e850b5 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs @@ -58,7 +58,15 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) var il = dm.GetILGenerator(6); if ({IsValidName}) {{ - il.Emit(OpCodes.Newobj, {ConsructorName}); + if ({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null) + il.Emit(OpCodes.Newobj, {ConsructorName}); + else + {{ + il.DeclareLocal(typeof(T)); + //il.Emit(OpCodes.Ldloca_S, (short)0) + //il.Emit(OpCodes.Initobj, typeof(T)); + il.Emit(OpCodes.Ldloc_0); + }} }} else {{ diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs index 6fc2aba..f42ce7e 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs @@ -42,7 +42,15 @@ static FastNew() var il = dm.GetILGenerator(6); if (IsValid) { - il.Emit(OpCodes.Newobj, CachedConstructor); + if (global::@FastGenericNew.FastNew.CachedConstructor != null) + il.Emit(OpCodes.Newobj, CachedConstructor); + else + { + il.DeclareLocal(typeof(T)); + //il.Emit(OpCodes.Ldloca_S, (short)0) + //il.Emit(OpCodes.Initobj, typeof(T)); + il.Emit(OpCodes.Ldloc_0); + } } else { From 70b4acd2ecfb150088521ea061cf7c8e0e14d110 Mon Sep 17 00:00:00 2001 From: Nyerst Date: Tue, 15 Mar 2022 20:42:36 +0800 Subject: [PATCH 04/12] Fix nullable warnings --- .../CodeGenerators/FastNewCoreGenerator.cs | 4 +-- .../FastNew{T}.g.cs | 34 +++++++++---------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs index 3e850b5..228ede1 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs @@ -59,7 +59,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) if ({IsValidName}) {{ if ({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null) - il.Emit(OpCodes.Newobj, {ConsructorName}); + il.Emit(OpCodes.Newobj, {ConsructorName}!); else {{ il.DeclareLocal(typeof(T)); @@ -184,7 +184,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) builder.AppendLine(); } #endregion - builder.AppendLine(4, $"il.Emit(OpCodes.Newobj, {ConsructorName});"); + builder.AppendLine(4, $"il.Emit(OpCodes.Newobj, {ConsructorName}!);"); builder.AppendLine(3, $"}}"); builder.AppendLine(3, $"else"); diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs index f42ce7e..da84a9e 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs @@ -43,7 +43,7 @@ static FastNew() if (IsValid) { if (global::@FastGenericNew.FastNew.CachedConstructor != null) - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); else { il.DeclareLocal(typeof(T)); @@ -86,7 +86,7 @@ static FastNew() if (IsValid) { il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -124,7 +124,7 @@ static FastNew() { il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -164,7 +164,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -206,7 +206,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -250,7 +250,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); il.Emit(OpCodes.Ldarg_S, (byte)4); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -296,7 +296,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_3); il.Emit(OpCodes.Ldarg_S, (byte)4); il.Emit(OpCodes.Ldarg_S, (byte)5); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -344,7 +344,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)4); il.Emit(OpCodes.Ldarg_S, (byte)5); il.Emit(OpCodes.Ldarg_S, (byte)6); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -394,7 +394,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)5); il.Emit(OpCodes.Ldarg_S, (byte)6); il.Emit(OpCodes.Ldarg_S, (byte)7); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -446,7 +446,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)6); il.Emit(OpCodes.Ldarg_S, (byte)7); il.Emit(OpCodes.Ldarg_S, (byte)8); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -500,7 +500,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)7); il.Emit(OpCodes.Ldarg_S, (byte)8); il.Emit(OpCodes.Ldarg_S, (byte)9); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -556,7 +556,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)8); il.Emit(OpCodes.Ldarg_S, (byte)9); il.Emit(OpCodes.Ldarg_S, (byte)10); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -614,7 +614,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)9); il.Emit(OpCodes.Ldarg_S, (byte)10); il.Emit(OpCodes.Ldarg_S, (byte)11); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -674,7 +674,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)10); il.Emit(OpCodes.Ldarg_S, (byte)11); il.Emit(OpCodes.Ldarg_S, (byte)12); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -736,7 +736,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)11); il.Emit(OpCodes.Ldarg_S, (byte)12); il.Emit(OpCodes.Ldarg_S, (byte)13); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -800,7 +800,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)12); il.Emit(OpCodes.Ldarg_S, (byte)13); il.Emit(OpCodes.Ldarg_S, (byte)14); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { @@ -866,7 +866,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)13); il.Emit(OpCodes.Ldarg_S, (byte)14); il.Emit(OpCodes.Ldarg_S, (byte)15); - il.Emit(OpCodes.Newobj, CachedConstructor); + il.Emit(OpCodes.Newobj, CachedConstructor!); } else { From 0cb8db5a7de2bb5dce409bf9a9be11958767bc57 Mon Sep 17 00:00:00 2001 From: Nyerst Date: Thu, 17 Mar 2022 14:10:38 +0800 Subject: [PATCH 05/12] Bind the DynamicMethod to an object for better performance --- .../CodeGenerators/DynMetClosureGenerator.cs | 29 +++++ .../CodeGenerators/FastNewCoreGenerator.cs | 15 +-- .../DynMetClosure.g.cs | 26 +++++ .../FastNew{T}.g.cs | 100 +++++++++--------- 4 files changed, 113 insertions(+), 57 deletions(-) create mode 100644 FastGenericNew.SourceGenerator/CodeGenerators/DynMetClosureGenerator.cs create mode 100644 FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/DynMetClosure.g.cs diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/DynMetClosureGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/DynMetClosureGenerator.cs new file mode 100644 index 0000000..9c70a13 --- /dev/null +++ b/FastGenericNew.SourceGenerator/CodeGenerators/DynMetClosureGenerator.cs @@ -0,0 +1,29 @@ +namespace FastGenericNew.SourceGenerator.CodeGenerators; + +public class DynMetClosureGenerator : CodeGenerator +{ + public override string Filename => "DynMetClosure.g.cs"; + + internal const string ClassName = "_FastNewDynMetClosure"; + + internal const string InstanceOnlyArrayName = "InstanceOnlyArray"; + + internal const string InstanceName = "Instance"; + + public override CodeGenerationResult Generate(in GeneratorOptions options) + { + CodeBuilder builder = new(512, in options); + builder.WriteFileHeader(); + builder.StartNamespace(); + builder.AppendLine(@$" + [EditorBrowsable(EditorBrowsableState.Never)] + internal sealed partial class {ClassName} + {{ + public static readonly Type[] {InstanceOnlyArrayName} = new Type[] {{ typeof({options.GlobalNSDot()}{ClassName}) }}; + + public static readonly {options.GlobalNSDot()}{ClassName} {InstanceName} = new {options.GlobalNSDot()}{ClassName}(); + }}"); + builder.EndNamespace(); + return builder.BuildAndDispose(this); + } +} \ No newline at end of file diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs index 228ede1..d4976ff 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs @@ -54,7 +54,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) static {ClassName}() {{ - var dm = new DynamicMethod("""", typeof(T), null, restrictedSkipVisibility: true); + var dm = new DynamicMethod("""", typeof(T), {options.GlobalNSDot()}{DynMetClosureGenerator.ClassName}.{DynMetClosureGenerator.InstanceOnlyArrayName}, restrictedSkipVisibility: true); var il = dm.GetILGenerator(6); if ({IsValidName}) {{ @@ -73,7 +73,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) il.Emit(OpCodes.Call, {options.GlobalNSDot()}{ThrowHelperGenerator.ClassName}.GetSmartThrow()); }} il.Emit(OpCodes.Ret); - {CompiledDelegateName} = ({compiledDelegateTypeNoParam})dm.CreateDelegate(typeof({compiledDelegateTypeNoParam})); + {CompiledDelegateName} = ({compiledDelegateTypeNoParam})dm.CreateDelegate(typeof({compiledDelegateTypeNoParam}), {options.GlobalNSDot()}{DynMetClosureGenerator.ClassName}.{DynMetClosureGenerator.InstanceName}); }} }}"); @@ -147,7 +147,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) #endregion #region Final - builder.Append(3, "var dm = new DynamicMethod(\"\", typeof(T), new Type[] { "); + builder.Append(3, $@"var dm = new DynamicMethod("""", typeof(T), new Type[] {{ typeof({options.GlobalNSDot()}{DynMetClosureGenerator.ClassName}), "); for (int i = 0; i < parameterIndex; i++) { if (i != 0) @@ -170,15 +170,16 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) #region Parameters for (int i = 0; i < parameterIndex; i++) { + var actual = i + 1; builder.Append(4, "il.Emit("); - builder.Append(i switch + builder.Append(actual switch { 0 => "OpCodes.Ldarg_0", 1 => "OpCodes.Ldarg_1", 2 => "OpCodes.Ldarg_2", 3 => "OpCodes.Ldarg_3", - _ when i <= 255 => $"OpCodes.Ldarg_S, (byte){i}", - _ => $"OpCodes.Ldarg, (short){i}", + _ when actual <= 255 => $"OpCodes.Ldarg_S, (byte){actual}", + _ => $"OpCodes.Ldarg, (short){actual}", }); builder.Append(')', ';'); builder.AppendLine(); @@ -199,7 +200,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) builder.UseGenericDelegate(parameterIndex); builder.Append(")dm.CreateDelegate(typeof("); builder.UseGenericDelegate(parameterIndex); - builder.AppendLine("));"); + builder.AppendLine($"), {options.GlobalNSDot()}{DynMetClosureGenerator.ClassName}.{DynMetClosureGenerator.InstanceName});"); #endregion builder.EndBlock(2); diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/DynMetClosure.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/DynMetClosure.g.cs new file mode 100644 index 0000000..22e2002 --- /dev/null +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/DynMetClosure.g.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by FastGenericNew.SourceGenerator +// Please do not modify this file directly +// +//------------------------------------------------------------------------------ +#nullable enable +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Diagnostics.CodeAnalysis; +using System.Reflection; +using System.Reflection.Emit; +using System.ComponentModel; + +namespace @FastGenericNew +{ + + [EditorBrowsable(EditorBrowsableState.Never)] + internal sealed partial class _FastNewDynMetClosure + { + public static readonly Type[] InstanceOnlyArray = new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure) }; + + public static readonly global::@FastGenericNew._FastNewDynMetClosure Instance = new global::@FastGenericNew._FastNewDynMetClosure(); + } +} diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs index da84a9e..f15da8e 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs @@ -38,7 +38,7 @@ internal static partial class FastNew< static FastNew() { - var dm = new DynamicMethod("", typeof(T), null, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), global::@FastGenericNew._FastNewDynMetClosure.InstanceOnlyArray, restrictedSkipVisibility: true); var il = dm.GetILGenerator(6); if (IsValid) { @@ -57,7 +57,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -81,11 +81,11 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(10); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -93,7 +93,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -118,12 +118,12 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(11); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -131,7 +131,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -157,13 +157,13 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(12); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Ldarg_3); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -171,7 +171,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -198,14 +198,14 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(13); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); + il.Emit(OpCodes.Ldarg_S, (byte)4); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -213,7 +213,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -241,15 +241,15 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(14); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); il.Emit(OpCodes.Ldarg_S, (byte)4); + il.Emit(OpCodes.Ldarg_S, (byte)5); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -257,7 +257,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -286,16 +286,16 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(15); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); il.Emit(OpCodes.Ldarg_S, (byte)4); il.Emit(OpCodes.Ldarg_S, (byte)5); + il.Emit(OpCodes.Ldarg_S, (byte)6); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -303,7 +303,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -333,17 +333,17 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(16); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); il.Emit(OpCodes.Ldarg_S, (byte)4); il.Emit(OpCodes.Ldarg_S, (byte)5); il.Emit(OpCodes.Ldarg_S, (byte)6); + il.Emit(OpCodes.Ldarg_S, (byte)7); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -351,7 +351,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -382,11 +382,10 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(17); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); @@ -394,6 +393,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)5); il.Emit(OpCodes.Ldarg_S, (byte)6); il.Emit(OpCodes.Ldarg_S, (byte)7); + il.Emit(OpCodes.Ldarg_S, (byte)8); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -401,7 +401,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -433,11 +433,10 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(18); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); @@ -446,6 +445,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)6); il.Emit(OpCodes.Ldarg_S, (byte)7); il.Emit(OpCodes.Ldarg_S, (byte)8); + il.Emit(OpCodes.Ldarg_S, (byte)9); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -453,7 +453,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -486,11 +486,10 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(19); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); @@ -500,6 +499,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)7); il.Emit(OpCodes.Ldarg_S, (byte)8); il.Emit(OpCodes.Ldarg_S, (byte)9); + il.Emit(OpCodes.Ldarg_S, (byte)10); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -507,7 +507,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -541,11 +541,10 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(20); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); @@ -556,6 +555,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)8); il.Emit(OpCodes.Ldarg_S, (byte)9); il.Emit(OpCodes.Ldarg_S, (byte)10); + il.Emit(OpCodes.Ldarg_S, (byte)11); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -563,7 +563,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -598,11 +598,10 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(21); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); @@ -614,6 +613,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)9); il.Emit(OpCodes.Ldarg_S, (byte)10); il.Emit(OpCodes.Ldarg_S, (byte)11); + il.Emit(OpCodes.Ldarg_S, (byte)12); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -621,7 +621,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -657,11 +657,10 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(22); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); @@ -674,6 +673,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)10); il.Emit(OpCodes.Ldarg_S, (byte)11); il.Emit(OpCodes.Ldarg_S, (byte)12); + il.Emit(OpCodes.Ldarg_S, (byte)13); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -681,7 +681,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -718,11 +718,10 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(23); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); @@ -736,6 +735,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)11); il.Emit(OpCodes.Ldarg_S, (byte)12); il.Emit(OpCodes.Ldarg_S, (byte)13); + il.Emit(OpCodes.Ldarg_S, (byte)14); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -743,7 +743,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -781,11 +781,10 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(24); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); @@ -800,6 +799,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)12); il.Emit(OpCodes.Ldarg_S, (byte)13); il.Emit(OpCodes.Ldarg_S, (byte)14); + il.Emit(OpCodes.Ldarg_S, (byte)15); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -807,7 +807,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } internal static partial class FastNew< @@ -846,11 +846,10 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14), typeof(TArg15) }, restrictedSkipVisibility: true); + var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14), typeof(TArg15) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(25); if (IsValid) { - il.Emit(OpCodes.Ldarg_0); il.Emit(OpCodes.Ldarg_1); il.Emit(OpCodes.Ldarg_2); il.Emit(OpCodes.Ldarg_3); @@ -866,6 +865,7 @@ static FastNew() il.Emit(OpCodes.Ldarg_S, (byte)13); il.Emit(OpCodes.Ldarg_S, (byte)14); il.Emit(OpCodes.Ldarg_S, (byte)15); + il.Emit(OpCodes.Ldarg_S, (byte)16); il.Emit(OpCodes.Newobj, CachedConstructor!); } else @@ -873,7 +873,7 @@ static FastNew() il.Emit(OpCodes.Call, global::@FastGenericNew.ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func)); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } } From f720cd553ff0211b456d743bedb8007a1af93f07 Mon Sep 17 00:00:00 2001 From: Nyerst Date: Thu, 17 Mar 2022 14:52:58 +0800 Subject: [PATCH 06/12] Respect 'NonPublicConstructorSupport' option --- .../CodeGenerators/FastNewCoreGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs index d4976ff..a6f11b6 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs @@ -41,7 +41,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) /// The constructor of with given arguments.
/// Could be if the constructor couldn't be found. /// - public static readonly ConstructorInfo? {ConsructorName} = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); + public static readonly ConstructorInfo? {ConsructorName} = typeof(T).GetConstructor({(options.NonPublicConstructorSupport ? "BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic" : "BindingFlags.Instance | BindingFlags.Public")}, null, Type.EmptyTypes, null); #if NETFRAMEWORK [EditorBrowsable(EditorBrowsableState.Never)] From 4d633f79b55668516cf1f6e8abdabbb393ac940b Mon Sep 17 00:00:00 2001 From: Nyerst Date: Fri, 18 Mar 2022 00:14:07 +0800 Subject: [PATCH 07/12] Minor optimizations --- .../CodeGenerators/FastNewCoreGenerator.cs | 2 +- .../CodeGenerators/ThrowHelperGenerator.cs | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs index a6f11b6..9669793 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs @@ -55,7 +55,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) static {ClassName}() {{ var dm = new DynamicMethod("""", typeof(T), {options.GlobalNSDot()}{DynMetClosureGenerator.ClassName}.{DynMetClosureGenerator.InstanceOnlyArrayName}, restrictedSkipVisibility: true); - var il = dm.GetILGenerator(6); + var il = dm.GetILGenerator(); if ({IsValidName}) {{ if ({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null) diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/ThrowHelperGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/ThrowHelperGenerator.cs index 89b96e4..2278898 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/ThrowHelperGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/ThrowHelperGenerator.cs @@ -17,7 +17,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) [EditorBrowsable(EditorBrowsableState.Never)] internal static partial class ThrowHelper {{ - [MethodImpl(MethodImplOptions.NoInlining)]"); + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)]"); if (options.Trimmable) builder.AppendLine(@$" #if NET5_0_OR_GREATER @@ -28,13 +28,15 @@ internal static partial class ThrowHelper public static T SmartThrowImpl() {{ + var qualifiedName = typeof(T).AssemblyQualifiedName; + if (typeof(T).IsInterface) - throw new System.MissingMethodException($""Cannot create an instance of an interface: '{{typeof(T).AssemblyQualifiedName}}'""); + throw new System.MissingMethodException($""Cannot create an instance of an interface: '{{ qualifiedName }}'""); if (typeof(T).IsAbstract) - throw new System.MissingMethodException($""Cannot create an abstract class: '{{typeof(T).AssemblyQualifiedName}}'""); + throw new System.MissingMethodException($""Cannot create an abstract class: '{{ qualifiedName }}'""); - throw new System.MissingMethodException($""No match constructor found in type: '{{typeof(T).AssemblyQualifiedName}}'""); + throw new System.MissingMethodException($""No match constructor found in type: '{{ qualifiedName }}'""); }} }}"); builder.EndNamespace(); From 3828bbd32e80de5256ab9877f8f99860cb7d5117 Mon Sep 17 00:00:00 2001 From: Nyerst Date: Fri, 18 Mar 2022 13:22:17 +0800 Subject: [PATCH 08/12] update --- .../Benchmarks/CtorExprILBenchmark.cs | 110 ++++++++++++++++++ FastGenericNew.Benchmarks/Program.cs | 5 +- .../FastNew{T}.g.cs | 2 +- .../ThrowHelper.g.cs | 10 +- 4 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs diff --git a/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs b/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs new file mode 100644 index 0000000..910a2ba --- /dev/null +++ b/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs @@ -0,0 +1,110 @@ +using System.ComponentModel; +using System.Diagnostics; +using System.Linq.Expressions; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; + +namespace FastGenericNew.Benchmarks.Benchmarks; + +public class CtorExprILBenchmark +{ + [Benchmark] + public void CCtorIL() + { + FastNewIL.cctor(); + } + + [Benchmark(Baseline = true)] + public void CCtorExpr() + { + FastNewExpr.cctor(); + } + + #region Expression + internal static partial class FastNewExpr + { + public static ConstructorInfo? CachedConstructor; + + public static Expression>? SourceExpression; + + public static Func? CompiledDelegate; + + public static bool IsValid; + + public static void cctor() + { + CachedConstructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); + IsValid = typeof(T).IsValueType || (CachedConstructor != null && !typeof(T).IsAbstract); + SourceExpression = Expression.Lambda>((!typeof(T).IsValueType) ? ((CachedConstructor != null && !typeof(T).IsAbstract) ? ((Expression)Expression.New(CachedConstructor)) : ((Expression)Expression.Call(ThrowHelper.GetSmartThrow(), Expression.Constant(CachedConstructor, typeof(ConstructorInfo))))) : ((CachedConstructor != null) ? Expression.New(CachedConstructor) : Expression.New(typeof(T))), Array.Empty()); + CompiledDelegate = SourceExpression.Compile(); + } + } + + #endregion + + #region ILEmit + [EditorBrowsable(EditorBrowsableState.Never)] + [DebuggerStepThrough] + internal sealed class Closure + { + public static readonly Type[] InstanceOnlyArray = new[] { typeof(Closure) }; + + public static readonly Closure Instance = new(); + } + + internal static partial class FastNewIL + { + public static ConstructorInfo? CachedConstructor; + + public static Func? CompiledDelegate; + + public static bool IsValid; + + public static void cctor() + { + CachedConstructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); + IsValid = typeof(T).IsValueType || CachedConstructor != null && !typeof(T).IsAbstract; + var dm = new DynamicMethod("", typeof(T), Closure.InstanceOnlyArray, true); + + var il = dm.GetILGenerator(); + if (IsValid) + { + if (CachedConstructor != null) + il.Emit(OpCodes.Newobj, CachedConstructor!); + else + { + il.DeclareLocal(typeof(T)); + il.Emit(OpCodes.Ldloc_0); + } + } + else + { + il.Emit(OpCodes.Call, ThrowHelper.GetSmartThrow()); + } + il.Emit(OpCodes.Ret); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), Closure.Instance); + } + } + #endregion + + public class DemoClass { } + + [EditorBrowsable(EditorBrowsableState.Never)] + internal static partial class ThrowHelper + { + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] + + public static MethodInfo GetSmartThrow() => typeof(ThrowHelper).GetMethod("SmartThrowImpl", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static)!.MakeGenericMethod(typeof(T)); + + public static T SmartThrowImpl() + { + if (typeof(T).IsInterface) + throw new MissingMethodException($"Cannot create an instance of an interface: '{typeof(T).AssemblyQualifiedName}'"); + + if (typeof(T).IsAbstract) + throw new MissingMethodException($"Cannot create an abstract class: '{typeof(T).AssemblyQualifiedName}'"); + + throw new MissingMethodException($"No match constructor found in type: '{typeof(T).AssemblyQualifiedName}'"); + } + } +} diff --git a/FastGenericNew.Benchmarks/Program.cs b/FastGenericNew.Benchmarks/Program.cs index f02eaaa..926569c 100644 --- a/FastGenericNew.Benchmarks/Program.cs +++ b/FastGenericNew.Benchmarks/Program.cs @@ -3,6 +3,8 @@ using BenchmarkDotNet.Diagnosers; using BenchmarkDotNet.Environments; +using FastGenericNew.Benchmarks.Benchmarks; + ManualConfig config = ManualConfig.Create(DefaultConfig.Instance); config.AddJob( Job.Default.WithRuntime(ClrRuntime.Net48), @@ -11,4 +13,5 @@ config.AddDiagnoser(MemoryDiagnoser.Default); -BenchmarkRunner.Run(Assembly.GetCallingAssembly(), config); \ No newline at end of file +//BenchmarkRunner.Run(Assembly.GetCallingAssembly(), config); +BenchmarkRunner.Run(config); \ No newline at end of file diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs index f15da8e..8968fb8 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs @@ -39,7 +39,7 @@ internal static partial class FastNew< static FastNew() { var dm = new DynamicMethod("", typeof(T), global::@FastGenericNew._FastNewDynMetClosure.InstanceOnlyArray, restrictedSkipVisibility: true); - var il = dm.GetILGenerator(6); + var il = dm.GetILGenerator(); if (IsValid) { if (global::@FastGenericNew.FastNew.CachedConstructor != null) diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ThrowHelper.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ThrowHelper.g.cs index dc86e84..6486024 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ThrowHelper.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/ThrowHelper.g.cs @@ -19,7 +19,7 @@ namespace @FastGenericNew [EditorBrowsable(EditorBrowsableState.Never)] internal static partial class ThrowHelper { - [MethodImpl(MethodImplOptions.NoInlining)] + [MethodImpl(MethodImplOptions.NoInlining | MethodImplOptions.NoOptimization)] #if NET5_0_OR_GREATER [DynamicDependency("SmartThrowImpl``1()", typeof(global::@FastGenericNew.ThrowHelper))] @@ -29,13 +29,15 @@ internal static partial class ThrowHelper public static T SmartThrowImpl() { + var qualifiedName = typeof(T).AssemblyQualifiedName; + if (typeof(T).IsInterface) - throw new System.MissingMethodException($"Cannot create an instance of an interface: '{typeof(T).AssemblyQualifiedName}'"); + throw new System.MissingMethodException($"Cannot create an instance of an interface: '{ qualifiedName }'"); if (typeof(T).IsAbstract) - throw new System.MissingMethodException($"Cannot create an abstract class: '{typeof(T).AssemblyQualifiedName}'"); + throw new System.MissingMethodException($"Cannot create an abstract class: '{ qualifiedName }'"); - throw new System.MissingMethodException($"No match constructor found in type: '{typeof(T).AssemblyQualifiedName}'"); + throw new System.MissingMethodException($"No match constructor found in type: '{ qualifiedName }'"); } } } From b62ac722a2873320f9038ad856d7c7147338574b Mon Sep 17 00:00:00 2001 From: Nyerst Date: Fri, 18 Mar 2022 13:56:51 +0800 Subject: [PATCH 09/12] Use Expression on .NET FX and use ILGenerator on .NET Core for best performance --- .../CodeGenerators/DynMetClosureGenerator.cs | 4 +- .../CodeGenerators/FastNewCoreGenerator.cs | 95 +++++- .../FastNew{T}.g.cs | 281 +++++++++++++++++- ...DynMetClosure.g.cs => _DynMetClosure.g.cs} | 0 4 files changed, 375 insertions(+), 5 deletions(-) rename FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/{DynMetClosure.g.cs => _DynMetClosure.g.cs} (100%) diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/DynMetClosureGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/DynMetClosureGenerator.cs index 9c70a13..3a8bd78 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/DynMetClosureGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/DynMetClosureGenerator.cs @@ -2,7 +2,7 @@ public class DynMetClosureGenerator : CodeGenerator { - public override string Filename => "DynMetClosure.g.cs"; + public override string Filename => "_DynMetClosure.g.cs"; internal const string ClassName = "_FastNewDynMetClosure"; @@ -12,7 +12,7 @@ public class DynMetClosureGenerator : CodeGenerator public override CodeGenerationResult Generate(in GeneratorOptions options) { - CodeBuilder builder = new(512, in options); + CodeBuilder builder = new(1536, in options); builder.WriteFileHeader(); builder.StartNamespace(); builder.AppendLine(@$" diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs index 9669793..d25bfbf 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs @@ -22,6 +22,10 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) builder.Indent(1); builder.AppendAccessibility(options.PublicFastNewCore); + // Use Expression on .NET Framework + // Use ILGenerator on .NET Core + const string UseExpressionCondition = "NETFRAMEWORK"; + #region Get CompiledDelegateName Type string compiledDelegateTypeNoParam; { @@ -30,7 +34,40 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) compiledDelegateTypeNoParam = internalBuilder.ToString(); } #endregion - + builder.Pre_If(UseExpressionCondition); + #region Expression + builder.AppendLine(@$"static partial class {ClassName}< +#if NET5_0_OR_GREATER +{options.DynamicallyAccessedMembers(0)} +#endif +T> + {{ +#if NETFRAMEWORK + [EditorBrowsable(EditorBrowsableState.Never)] + internal static readonly bool _isValueTypeT = typeof(T).IsValueType; +#endif + /// + /// The constructor of with given arguments.
+ /// Could be if the constructor couldn't be found. + ///
+ public static readonly ConstructorInfo? {ConsructorName} = typeof(T).GetConstructor({(options.NonPublicConstructorSupport +? "BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic" +: "BindingFlags.Instance | BindingFlags.Public")}, null, Type.EmptyTypes, null); + + {(options.PublicCompiledDelegate ? "public" : "internal")} static readonly Func {CompiledDelegateName} = System.Linq.Expressions.Expression.Lambda>(typeof(T).IsValueType + ? ({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New({options.GlobalNSDot()}{ClassName}.{ConsructorName}) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(typeof(T))) + : (({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null && !typeof(T).IsAbstract) + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New({options.GlobalNSDot()}{ClassName}.{ConsructorName}) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call({options.GlobalNSDot()}{ThrowHelperGenerator.ClassName}.GetSmartThrow(), System.Linq.Expressions.Expression.Constant({options.GlobalNSDot()}{ClassName}.{ConsructorName}, typeof(ConstructorInfo)))) + , Array.Empty()).Compile(); + + public static readonly bool {IsValidName} = typeof(T).IsValueType || ({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null && !typeof(T).IsAbstract); + }}"); + #endregion + builder.Pre_Else(); + #region IL builder.AppendLine(@$"static partial class {ClassName}< #if NET5_0_OR_GREATER {options.DynamicallyAccessedMembers(0)} @@ -76,6 +113,8 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) {CompiledDelegateName} = ({compiledDelegateTypeNoParam})dm.CreateDelegate(typeof({compiledDelegateTypeNoParam}), {options.GlobalNSDot()}{DynMetClosureGenerator.ClassName}.{DynMetClosureGenerator.InstanceName}); }} }}"); + #endregion + builder.Pre_EndIf(); for (int parameterIndex = 1; parameterIndex <= options.MaxParameterCount; parameterIndex++) { @@ -89,7 +128,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) builder.StartBlock(1); - #region MyRegion + #region CachedConstructor builder.XmlDoc(2, @" /// /// The constructor of with given arguments.
@@ -146,6 +185,56 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) builder.AppendLine(3, $"IsValid = {ConsructorName} != null && !typeof(T).IsAbstract;"); #endregion + builder.Pre_If(UseExpressionCondition); + #region Expression + + #region Parameters + for (int i = 0; i < parameterIndex; i++) + { + builder.Indent(3); + builder.Append("var "); + builder.AppendGenericMethodArgumentName(i); + builder.Append(" = System.Linq.Expressions.Expression.Parameter(typeof("); + builder.AppendGenericArgumentName(i); + builder.Append("));\n"); + } + #endregion + + builder.Indent(3); + builder.Append($"{CompiledDelegateName} = (System.Linq.Expressions.Expression.Lambda<"); + builder.UseGenericDelegate(parameterIndex); + builder.AppendLine($">({IsValidName}"); + + builder.Indent(4); + builder.Append($"? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New({ConsructorName}!"); + for (int i = 0; i < parameterIndex; i++) + { + builder.Append(',', ' '); + builder.AppendGenericMethodArgumentName(i); + } + builder.AppendLine(')'); + + builder.Indent(4); + builder.Append(": (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call("); + builder.GlobalNamespaceDot(); + builder.Append($"{ThrowHelperGenerator.ClassName}.GetSmartThrow(), "); + builder.Append($"System.Linq.Expressions.Expression.Constant({ConsructorName}, typeof(ConstructorInfo))"); + builder.AppendLine(')'); + + builder.Indent(3); + builder.Append(", new System.Linq.Expressions.ParameterExpression[] { "); + for (int i = 0; i < parameterIndex; i++) + { + if (i != 0) + { + builder.Append(',', ' '); + } + builder.AppendGenericMethodArgumentName(i); + } + builder.AppendLine(" })).Compile();"); + #endregion + builder.Pre_Else(); + #region IL #region Final builder.Append(3, $@"var dm = new DynamicMethod("""", typeof(T), new Type[] {{ typeof({options.GlobalNSDot()}{DynMetClosureGenerator.ClassName}), "); for (int i = 0; i < parameterIndex; i++) @@ -202,6 +291,8 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) builder.UseGenericDelegate(parameterIndex); builder.AppendLine($"), {options.GlobalNSDot()}{DynMetClosureGenerator.ClassName}.{DynMetClosureGenerator.InstanceName});"); #endregion + #endregion + builder.Pre_EndIf(); builder.EndBlock(2); #endregion diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs index 8968fb8..8b3cc6a 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs @@ -15,7 +15,37 @@ namespace @FastGenericNew { - internal static partial class FastNew< + internal +#if NETFRAMEWORK +static partial class FastNew< +#if NET5_0_OR_GREATER +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.NonPublicConstructors)] +#endif +T> + { +#if NETFRAMEWORK + [EditorBrowsable(EditorBrowsableState.Never)] + internal static readonly bool _isValueTypeT = typeof(T).IsValueType; +#endif + /// + /// The constructor of with given arguments.
+ /// Could be if the constructor couldn't be found. + ///
+ public static readonly ConstructorInfo? CachedConstructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); + + public static readonly Func CompiledDelegate = System.Linq.Expressions.Expression.Lambda>(typeof(T).IsValueType + ? (global::@FastGenericNew.FastNew.CachedConstructor != null + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(global::@FastGenericNew.FastNew.CachedConstructor) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(typeof(T))) + : ((global::@FastGenericNew.FastNew.CachedConstructor != null && !typeof(T).IsAbstract) + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(global::@FastGenericNew.FastNew.CachedConstructor) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(global::@FastGenericNew.FastNew.CachedConstructor, typeof(ConstructorInfo)))) + , Array.Empty()).Compile(); + + public static readonly bool IsValid = typeof(T).IsValueType || (global::@FastGenericNew.FastNew.CachedConstructor != null && !typeof(T).IsAbstract); + } +#else +static partial class FastNew< #if NET5_0_OR_GREATER [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.NonPublicConstructors)] #endif @@ -60,6 +90,7 @@ static FastNew() CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); } } +#endif internal static partial class FastNew< #if NET5_0_OR_GREATER [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] @@ -81,6 +112,13 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(10); if (IsValid) @@ -94,6 +132,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -118,6 +157,14 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(11); if (IsValid) @@ -132,6 +179,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -157,6 +205,15 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(12); if (IsValid) @@ -172,6 +229,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -198,6 +256,16 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(13); if (IsValid) @@ -214,6 +282,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -241,6 +310,17 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(14); if (IsValid) @@ -258,6 +338,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -286,6 +367,18 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(15); if (IsValid) @@ -304,6 +397,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -333,6 +427,19 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(16); if (IsValid) @@ -352,6 +459,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -382,6 +490,20 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); + var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(17); if (IsValid) @@ -402,6 +524,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -433,6 +556,21 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); + var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); + var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(18); if (IsValid) @@ -454,6 +592,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -486,6 +625,22 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); + var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); + var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); + var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(19); if (IsValid) @@ -508,6 +663,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -541,6 +697,23 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); + var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); + var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); + var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); + var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(20); if (IsValid) @@ -564,6 +737,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -598,6 +772,24 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); + var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); + var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); + var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); + var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); + var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(21); if (IsValid) @@ -622,6 +814,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -657,6 +850,25 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); + var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); + var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); + var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); + var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); + var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); + var p12 = System.Linq.Expressions.Expression.Parameter(typeof(TArg12)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(22); if (IsValid) @@ -682,6 +894,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -718,6 +931,26 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); + var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); + var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); + var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); + var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); + var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); + var p12 = System.Linq.Expressions.Expression.Parameter(typeof(TArg12)); + var p13 = System.Linq.Expressions.Expression.Parameter(typeof(TArg13)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(23); if (IsValid) @@ -744,6 +977,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -781,6 +1015,27 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); + var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); + var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); + var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); + var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); + var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); + var p12 = System.Linq.Expressions.Expression.Parameter(typeof(TArg12)); + var p13 = System.Linq.Expressions.Expression.Parameter(typeof(TArg13)); + var p14 = System.Linq.Expressions.Expression.Parameter(typeof(TArg14)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(24); if (IsValid) @@ -808,6 +1063,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } internal static partial class FastNew< @@ -846,6 +1102,28 @@ internal static partial class FastNew< static FastNew() { IsValid = CachedConstructor != null && !typeof(T).IsAbstract; +#if NETFRAMEWORK + var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); + var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); + var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); + var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); + var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); + var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); + var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); + var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); + var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); + var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); + var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); + var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); + var p12 = System.Linq.Expressions.Expression.Parameter(typeof(TArg12)); + var p13 = System.Linq.Expressions.Expression.Parameter(typeof(TArg13)); + var p14 = System.Linq.Expressions.Expression.Parameter(typeof(TArg14)); + var p15 = System.Linq.Expressions.Expression.Parameter(typeof(TArg15)); + CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 })).Compile(); +#else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14), typeof(TArg15) }, restrictedSkipVisibility: true); var il = dm.GetILGenerator(25); if (IsValid) @@ -874,6 +1152,7 @@ static FastNew() } il.Emit(OpCodes.Ret); CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), global::@FastGenericNew._FastNewDynMetClosure.Instance); +#endif } } } diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/DynMetClosure.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/_DynMetClosure.g.cs similarity index 100% rename from FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/DynMetClosure.g.cs rename to FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/_DynMetClosure.g.cs From 16464d28b3bffa2f72aeb65f4f9611938e680b36 Mon Sep 17 00:00:00 2001 From: Nyerst Date: Fri, 18 Mar 2022 14:06:19 +0800 Subject: [PATCH 10/12] Use Expression instead of ILGenerator on .NET Framework --- .../Benchmarks/CtorExprILBenchmark.cs | 73 ++++++++++++++++--- 1 file changed, 63 insertions(+), 10 deletions(-) diff --git a/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs b/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs index 910a2ba..b703f3c 100644 --- a/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs +++ b/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs @@ -1,5 +1,5 @@ using System.ComponentModel; -using System.Diagnostics; +using System.Diagnostics.CodeAnalysis; using System.Linq.Expressions; using System.Reflection.Emit; using System.Runtime.CompilerServices; @@ -44,18 +44,68 @@ public static void cctor() #region ILEmit [EditorBrowsable(EditorBrowsableState.Never)] - [DebuggerStepThrough] - internal sealed class Closure + internal sealed partial class _FastNewDynMetClosure { - public static readonly Type[] InstanceOnlyArray = new[] { typeof(Closure) }; + public static readonly Type[] InstanceOnlyArray = new Type[] { typeof(_FastNewDynMetClosure) }; - public static readonly Closure Instance = new(); + public static readonly _FastNewDynMetClosure Instance = new _FastNewDynMetClosure(); } - internal static partial class FastNewIL + + internal +#if NETFRAMEWORK +static partial class FastNewIL< +#if NET5_0_OR_GREATER +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.NonPublicConstructors)] +#endif + T> + { +#if NETFRAMEWORK + [EditorBrowsable(EditorBrowsableState.Never)] + internal static readonly bool _isValueTypeT = typeof(T).IsValueType; +#endif + /// + /// The constructor of with given arguments.
+ /// Could be if the constructor couldn't be found. + ///
+ public static ConstructorInfo? CachedConstructor; + + public static Func? CompiledDelegate; + + public static bool IsValid; + + public static void cctor() + { + CachedConstructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); + IsValid = typeof(T).IsValueType || (FastNewIL.CachedConstructor != null && !typeof(T).IsAbstract); + CompiledDelegate = System.Linq.Expressions.Expression.Lambda>(typeof(T).IsValueType + ? (FastNewIL.CachedConstructor != null + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(FastNewIL.CachedConstructor) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(typeof(T))) + : ((FastNewIL.CachedConstructor != null && !typeof(T).IsAbstract) + ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(FastNewIL.CachedConstructor) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(FastNewIL.CachedConstructor, typeof(ConstructorInfo)))) + , Array.Empty()).Compile(); + } + } +#else +static partial class FastNewIL< +#if NET5_0_OR_GREATER +[DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.NonPublicConstructors)] +#endif + T> { + /// + /// The constructor of with given arguments.
+ /// Could be if the constructor couldn't be found. + ///
public static ConstructorInfo? CachedConstructor; +#if NETFRAMEWORK + [EditorBrowsable(EditorBrowsableState.Never)] + internal static readonly bool _isValueTypeT = typeof(T).IsValueType; +#endif + public static Func? CompiledDelegate; public static bool IsValid; @@ -63,17 +113,19 @@ internal static partial class FastNewIL public static void cctor() { CachedConstructor = typeof(T).GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, Type.EmptyTypes, null); - IsValid = typeof(T).IsValueType || CachedConstructor != null && !typeof(T).IsAbstract; - var dm = new DynamicMethod("", typeof(T), Closure.InstanceOnlyArray, true); + IsValid = typeof(T).IsValueType || (FastNewIL.CachedConstructor != null && !typeof(T).IsAbstract); + var dm = new DynamicMethod("", typeof(T), _FastNewDynMetClosure.InstanceOnlyArray, restrictedSkipVisibility: true); var il = dm.GetILGenerator(); if (IsValid) { - if (CachedConstructor != null) + if (FastNewIL.CachedConstructor != null) il.Emit(OpCodes.Newobj, CachedConstructor!); else { il.DeclareLocal(typeof(T)); + //il.Emit(OpCodes.Ldloca_S, (short)0) + //il.Emit(OpCodes.Initobj, typeof(T)); il.Emit(OpCodes.Ldloc_0); } } @@ -82,9 +134,10 @@ public static void cctor() il.Emit(OpCodes.Call, ThrowHelper.GetSmartThrow()); } il.Emit(OpCodes.Ret); - CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), Closure.Instance); + CompiledDelegate = (Func)dm.CreateDelegate(typeof(Func), _FastNewDynMetClosure.Instance); } } +#endif #endregion public class DemoClass { } From e4f8c8c8b0547d2112b61947cddfba27c19b0031 Mon Sep 17 00:00:00 2001 From: Nyerst Date: Fri, 18 Mar 2022 14:10:55 +0800 Subject: [PATCH 11/12] Fix ThrowHelper parameter --- FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs | 6 +++--- .../CodeGenerators/FastNewCoreGenerator.cs | 2 +- .../FastNew{T}.g.cs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs b/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs index b703f3c..01505c0 100644 --- a/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs +++ b/FastGenericNew.Benchmarks/Benchmarks/CtorExprILBenchmark.cs @@ -9,13 +9,13 @@ namespace FastGenericNew.Benchmarks.Benchmarks; public class CtorExprILBenchmark { [Benchmark] - public void CCtorIL() + public void After() { FastNewIL.cctor(); } [Benchmark(Baseline = true)] - public void CCtorExpr() + public void Before() { FastNewExpr.cctor(); } @@ -84,7 +84,7 @@ public static void cctor() : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(typeof(T))) : ((FastNewIL.CachedConstructor != null && !typeof(T).IsAbstract) ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(FastNewIL.CachedConstructor) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(FastNewIL.CachedConstructor, typeof(ConstructorInfo)))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(ThrowHelper.GetSmartThrow())) , Array.Empty()).Compile(); } } diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs index d25bfbf..0efbd7c 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs @@ -60,7 +60,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(typeof(T))) : (({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null && !typeof(T).IsAbstract) ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New({options.GlobalNSDot()}{ClassName}.{ConsructorName}) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call({options.GlobalNSDot()}{ThrowHelperGenerator.ClassName}.GetSmartThrow(), System.Linq.Expressions.Expression.Constant({options.GlobalNSDot()}{ClassName}.{ConsructorName}, typeof(ConstructorInfo)))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call({options.GlobalNSDot()}{ThrowHelperGenerator.ClassName}.GetSmartThrow())) , Array.Empty()).Compile(); public static readonly bool {IsValidName} = typeof(T).IsValueType || ({options.GlobalNSDot()}{ClassName}.{ConsructorName} != null && !typeof(T).IsAbstract); diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs index 8b3cc6a..d3a5e1c 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs @@ -39,7 +39,7 @@ static partial class FastNew< : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(typeof(T))) : ((global::@FastGenericNew.FastNew.CachedConstructor != null && !typeof(T).IsAbstract) ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(global::@FastGenericNew.FastNew.CachedConstructor) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(global::@FastGenericNew.FastNew.CachedConstructor, typeof(ConstructorInfo)))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow())) , Array.Empty()).Compile(); public static readonly bool IsValid = typeof(T).IsValueType || (global::@FastGenericNew.FastNew.CachedConstructor != null && !typeof(T).IsAbstract); From a11354108d78abbc61ce6453476e0137e9c6f940 Mon Sep 17 00:00:00 2001 From: Nyerst Date: Fri, 18 Mar 2022 14:16:29 +0800 Subject: [PATCH 12/12] fix --- .../CodeGenerators/FastNewCoreGenerator.cs | 4 +-- .../FastNew{T}.g.cs | 32 +++++++++---------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs index 0efbd7c..01161b5 100644 --- a/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs +++ b/FastGenericNew.SourceGenerator/CodeGenerators/FastNewCoreGenerator.cs @@ -217,9 +217,7 @@ public override CodeGenerationResult Generate(in GeneratorOptions options) builder.Indent(4); builder.Append(": (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call("); builder.GlobalNamespaceDot(); - builder.Append($"{ThrowHelperGenerator.ClassName}.GetSmartThrow(), "); - builder.Append($"System.Linq.Expressions.Expression.Constant({ConsructorName}, typeof(ConstructorInfo))"); - builder.AppendLine(')'); + builder.AppendLine($"{ThrowHelperGenerator.ClassName}.GetSmartThrow())"); builder.Indent(3); builder.Append(", new System.Linq.Expressions.ParameterExpression[] { "); diff --git a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs index d3a5e1c..0ccaedb 100644 --- a/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs +++ b/FastGenericNew/_generated/FastGenericNew.SourceGenerator/FastGenericNew.SourceGenerator.Generator/FastNew{T}.g.cs @@ -116,7 +116,7 @@ static FastNew() var p0 = System.Linq.Expressions.Expression.Parameter(typeof(TArg0)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0) }, restrictedSkipVisibility: true); @@ -162,7 +162,7 @@ static FastNew() var p1 = System.Linq.Expressions.Expression.Parameter(typeof(TArg1)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1) }, restrictedSkipVisibility: true); @@ -211,7 +211,7 @@ static FastNew() var p2 = System.Linq.Expressions.Expression.Parameter(typeof(TArg2)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2) }, restrictedSkipVisibility: true); @@ -263,7 +263,7 @@ static FastNew() var p3 = System.Linq.Expressions.Expression.Parameter(typeof(TArg3)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3) }, restrictedSkipVisibility: true); @@ -318,7 +318,7 @@ static FastNew() var p4 = System.Linq.Expressions.Expression.Parameter(typeof(TArg4)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4) }, restrictedSkipVisibility: true); @@ -376,7 +376,7 @@ static FastNew() var p5 = System.Linq.Expressions.Expression.Parameter(typeof(TArg5)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5) }, restrictedSkipVisibility: true); @@ -437,7 +437,7 @@ static FastNew() var p6 = System.Linq.Expressions.Expression.Parameter(typeof(TArg6)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6) }, restrictedSkipVisibility: true); @@ -501,7 +501,7 @@ static FastNew() var p7 = System.Linq.Expressions.Expression.Parameter(typeof(TArg7)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7) }, restrictedSkipVisibility: true); @@ -568,7 +568,7 @@ static FastNew() var p8 = System.Linq.Expressions.Expression.Parameter(typeof(TArg8)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8) }, restrictedSkipVisibility: true); @@ -638,7 +638,7 @@ static FastNew() var p9 = System.Linq.Expressions.Expression.Parameter(typeof(TArg9)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9) }, restrictedSkipVisibility: true); @@ -711,7 +711,7 @@ static FastNew() var p10 = System.Linq.Expressions.Expression.Parameter(typeof(TArg10)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10) }, restrictedSkipVisibility: true); @@ -787,7 +787,7 @@ static FastNew() var p11 = System.Linq.Expressions.Expression.Parameter(typeof(TArg11)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11) }, restrictedSkipVisibility: true); @@ -866,7 +866,7 @@ static FastNew() var p12 = System.Linq.Expressions.Expression.Parameter(typeof(TArg12)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12) }, restrictedSkipVisibility: true); @@ -948,7 +948,7 @@ static FastNew() var p13 = System.Linq.Expressions.Expression.Parameter(typeof(TArg13)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13) }, restrictedSkipVisibility: true); @@ -1033,7 +1033,7 @@ static FastNew() var p14 = System.Linq.Expressions.Expression.Parameter(typeof(TArg14)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14) }, restrictedSkipVisibility: true); @@ -1121,7 +1121,7 @@ static FastNew() var p15 = System.Linq.Expressions.Expression.Parameter(typeof(TArg15)); CompiledDelegate = (System.Linq.Expressions.Expression.Lambda>(IsValid ? (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.New(CachedConstructor!, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15) - : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow(), System.Linq.Expressions.Expression.Constant(CachedConstructor, typeof(ConstructorInfo))) + : (System.Linq.Expressions.Expression)System.Linq.Expressions.Expression.Call(global::@FastGenericNew.ThrowHelper.GetSmartThrow()) , new System.Linq.Expressions.ParameterExpression[] { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 })).Compile(); #else var dm = new DynamicMethod("", typeof(T), new Type[] { typeof(global::@FastGenericNew._FastNewDynMetClosure), typeof(TArg0), typeof(TArg1), typeof(TArg2), typeof(TArg3), typeof(TArg4), typeof(TArg5), typeof(TArg6), typeof(TArg7), typeof(TArg8), typeof(TArg9), typeof(TArg10), typeof(TArg11), typeof(TArg12), typeof(TArg13), typeof(TArg14), typeof(TArg15) }, restrictedSkipVisibility: true);