Skip to content

Commit 0d06b44

Browse files
authored
Merge pull request #479 from dadhi/wip-soa-ilreader
@wip SOA ILReader
2 parents d953524 + de17e43 commit 0d06b44

File tree

13 files changed

+1482
-1862
lines changed

13 files changed

+1482
-1862
lines changed

src/FastExpressionCompiler.LightExpression/Expression.cs

Lines changed: 49 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,8 @@ public virtual bool TryEmit(CompilerFlags flags, ref ClosureInfo closure, IParam
8181
public virtual bool IsCustomToCSharpString => false;
8282

8383
[RequiresUnreferencedCode(Trimming.Message)]
84-
public virtual StringBuilder CustomToCSharpString(StringBuilder sb, EnclosedIn enclosedIn, ref SmallList4<NamedWithIndex> named,
84+
public virtual StringBuilder CustomToCSharpString(StringBuilder sb, EnclosedIn enclosedIn,
85+
ref SmallList<NamedWithIndex, Stack4<NamedWithIndex>> named,
8586
int lineIndent = 0, bool stripNamespace = false, Func<Type, string, string> printType = null, int indentSpaces = 4,
8687
ObjectToCode notRecognizedToCode = null) => sb;
8788

@@ -1597,7 +1598,7 @@ public static BinaryExpression LessThanOrEqual(Expression left, Expression right
15971598

15981599
public static BlockExpression Block(IEnumerable<Expression> expressions) => new BlockExpression(expressions.AsReadOnlyList()); // todo: @perf optimize the double copying
15991600

1600-
public static BlockExpression Block(in SmallList2<Expression> expressions) => new BlockExpression(in expressions);
1601+
public static BlockExpression Block(in SmallList<Expression, Stack2<Expression>> expressions) => new BlockExpression(in expressions);
16011602

16021603
public static BlockExpression Block(IEnumerable<ParameterExpression> variables, Expression expr0) =>
16031604
new ManyVariablesBlockExpression(variables.AsReadOnlyList(), expr0); // todo: @perf @mem add the check for empty variables
@@ -1619,7 +1620,7 @@ public static BlockExpression Block(IEnumerable<ParameterExpression> variables,
16191620
public static BlockExpression Block(IEnumerable<ParameterExpression> variables, IEnumerable<Expression> expressions) =>
16201621
Block(variables, expressions.AsReadOnlyList());
16211622

1622-
public static BlockExpression Block(IEnumerable<ParameterExpression> variables, in SmallList2<Expression> expressions)
1623+
public static BlockExpression Block(IEnumerable<ParameterExpression> variables, in SmallList<Expression, Stack2<Expression>> expressions)
16231624
{
16241625
var vars = variables.AsReadOnlyList();
16251626
return vars.Count == 0
@@ -1642,7 +1643,7 @@ public static BlockExpression Block(Type type, IReadOnlyList<Expression> express
16421643
public static BlockExpression Block(Type type, IEnumerable<Expression> expressions) =>
16431644
new TypedBlockExpression(type, expressions.AsReadOnlyList()); // todo: @perf @mem
16441645

1645-
public static BlockExpression Block(Type type, in SmallList2<Expression> expressions) =>
1646+
public static BlockExpression Block(Type type, in SmallList<Expression, Stack2<Expression>> expressions) =>
16461647
new TypedBlockExpression(type, in expressions);
16471648

16481649
public static BlockExpression Block(Type type, IEnumerable<ParameterExpression> variables, Expression expr0)
@@ -1669,7 +1670,7 @@ public static BlockExpression Block(Type type, IEnumerable<ParameterExpression>
16691670
public static BlockExpression Block(Type type, IEnumerable<ParameterExpression> variables, IEnumerable<Expression> expressions) =>
16701671
new TypedManyVariablesBlockExpression(type, variables.AsReadOnlyList(), expressions.AsReadOnlyList()); // todo: @perf @mem
16711672

1672-
public static BlockExpression Block(Type type, IEnumerable<ParameterExpression> variables, in SmallList2<Expression> expressions) =>
1673+
public static BlockExpression Block(Type type, IEnumerable<ParameterExpression> variables, in SmallList<Expression, Stack2<Expression>> expressions) =>
16731674
new TypedManyVariablesBlockExpression(type, variables.AsReadOnlyList(), in expressions);
16741675

16751676
public static BlockExpression MakeBlock(Type type, IEnumerable<ParameterExpression> variables, IEnumerable<Expression> expressions)
@@ -3352,7 +3353,8 @@ public override bool TryEmit(CompilerFlags flags, ref ClosureInfo closure, IPara
33523353

33533354
[RequiresUnreferencedCode(Trimming.Message)]
33543355
public override StringBuilder CustomToCSharpString(StringBuilder sb,
3355-
EnclosedIn enclosedIn, ref SmallList4<NamedWithIndex> named,
3356+
EnclosedIn enclosedIn,
3357+
ref SmallList<NamedWithIndex, Stack4<NamedWithIndex>> named,
33563358
int lineIndent = 0, bool stripNamespace = false, Func<Type, string, string> printType = null, int indentSpaces = 4,
33573359
ObjectToCode notRecognizedToCode = null)
33583360
{
@@ -5060,20 +5062,47 @@ public class BlockExpression : Expression, IArgumentProvider
50605062
public override ExpressionType NodeType => ExpressionType.Block;
50615063
public override Type Type => Result.Type;
50625064
public virtual IReadOnlyList<ParameterExpression> Variables => Tools.Empty<ParameterExpression>();
5063-
public SmallList2<Expression> Expressions;
5065+
public SmallList<Expression, Stack2<Expression>> Expressions;
50645066
public Expression Result => Expressions.GetLastSurePresentItem(); // todo: @check what if no expressions?
50655067
public virtual int ArgumentCount => 0;
50665068
public virtual Expression GetArgument(int index) => throw new NotImplementedException();
5067-
internal BlockExpression(in SmallList2<Expression> expressions) =>
5069+
internal BlockExpression(in SmallList<Expression, Stack2<Expression>> expressions) =>
50685070
Expressions = expressions;
5069-
internal BlockExpression(Expression e0) =>
5070-
Expressions.Populate1(e0);
5071-
internal BlockExpression(Expression e0, Expression e1) =>
5072-
Expressions.Populate2(e0, e1);
5073-
internal BlockExpression(Expression e0, Expression e1, params Expression[] rest) =>
5074-
Expressions.Populate(e0, e1, rest);
5075-
internal BlockExpression(IReadOnlyList<Expression> expressions) =>
5076-
Expressions.Populate(expressions);
5071+
internal BlockExpression(Expression e0)
5072+
{
5073+
Expressions.Stack._it0 = e0;
5074+
Expressions.Count = 1;
5075+
}
5076+
internal BlockExpression(Expression e0, Expression e1)
5077+
{
5078+
Expressions.Stack._it0 = e0;
5079+
Expressions.Stack._it1 = e1;
5080+
Expressions.Count = 2;
5081+
}
5082+
internal BlockExpression(Expression e0, Expression e1, params Expression[] rest)
5083+
{
5084+
Expressions.Stack._it0 = e0;
5085+
Expressions.Stack._it1 = e1;
5086+
Expressions.Rest = rest;
5087+
Expressions.Count = rest.Length + 2;
5088+
}
5089+
internal BlockExpression(IReadOnlyList<Expression> expressions)
5090+
{
5091+
Debug.Assert(expressions != null, "Expressions cannot be null");
5092+
var count = expressions.Count;
5093+
if (count >= 1)
5094+
Expressions.Stack._it0 = expressions[0];
5095+
if (count >= 2)
5096+
Expressions.Stack._it1 = expressions[1];
5097+
if (count >= 3)
5098+
{
5099+
var rest = new Expression[count - 2];
5100+
for (var i = 2; i < count; ++i)
5101+
rest[i - 2] = expressions[i];
5102+
Expressions.Rest = rest;
5103+
}
5104+
Expressions.Count = count;
5105+
}
50775106
#if SUPPORTS_VISITOR
50785107
[RequiresUnreferencedCode(Trimming.Message)]
50795108
protected internal override Expression Accept(ExpressionVisitor visitor) => visitor.VisitBlock(this);
@@ -5088,7 +5117,7 @@ internal override SysExpr CreateSysExpression(ref SmallList<LightAndSysExpr> exp
50885117
public sealed class TypedBlockExpression : BlockExpression
50895118
{
50905119
public override Type Type { get; }
5091-
internal TypedBlockExpression(Type type, in SmallList2<Expression> expressions) : base(in expressions) => Type = type;
5120+
internal TypedBlockExpression(Type type, in SmallList<Expression, Stack2<Expression>> expressions) : base(in expressions) => Type = type;
50925121
internal TypedBlockExpression(Type type, Expression e0) : base(e0) => Type = type;
50935122
internal TypedBlockExpression(Type type, Expression e0, Expression e1) : base(e0, e1) => Type = type;
50945123
internal TypedBlockExpression(Type type, Expression e0, Expression e1, params Expression[] rest) : base(e0, e1, rest) => Type = type;
@@ -5100,7 +5129,7 @@ public class ManyVariablesBlockExpression : BlockExpression
51005129
public sealed override IReadOnlyList<ParameterExpression> Variables { get; }
51015130
public sealed override int ArgumentCount => Expressions.Count;
51025131
public sealed override Expression GetArgument(int index) => Expressions.GetSurePresentItemRef(index);
5103-
internal ManyVariablesBlockExpression(IReadOnlyList<ParameterExpression> variables, in SmallList2<Expression> expressions) : base(in expressions) =>
5132+
internal ManyVariablesBlockExpression(IReadOnlyList<ParameterExpression> variables, in SmallList<Expression, Stack2<Expression>> expressions) : base(in expressions) =>
51045133
Variables = variables;
51055134
internal ManyVariablesBlockExpression(IReadOnlyList<ParameterExpression> variables, Expression e0) : base(e0) =>
51065135
Variables = variables;
@@ -5115,7 +5144,7 @@ internal ManyVariablesBlockExpression(IReadOnlyList<ParameterExpression> variabl
51155144
public sealed class TypedManyVariablesBlockExpression : ManyVariablesBlockExpression
51165145
{
51175146
public override Type Type { get; }
5118-
internal TypedManyVariablesBlockExpression(Type type, IReadOnlyList<ParameterExpression> variables, in SmallList2<Expression> expressions)
5147+
internal TypedManyVariablesBlockExpression(Type type, IReadOnlyList<ParameterExpression> variables, in SmallList<Expression, Stack2<Expression>> expressions)
51195148
: base(variables, in expressions) => Type = type;
51205149
internal TypedManyVariablesBlockExpression(Type type, IReadOnlyList<ParameterExpression> variables, Expression e0)
51215150
: base(variables, e0) => Type = type;
@@ -5283,7 +5312,7 @@ internal System.Linq.Expressions.LabelTarget ToSystemLabelTarget(ref SmallList<L
52835312
Justification = "The method is used for debugging purposes only.")]
52845313
public override string ToString()
52855314
{
5286-
SmallList4<NamedWithIndex> named = default;
5315+
SmallList<NamedWithIndex, Stack4<NamedWithIndex>> named = default;
52875316
return new StringBuilder().AppendLabelName(this, ref named).ToString();
52885317
}
52895318
}

src/FastExpressionCompiler.LightExpression/ExpressionVisitor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public IReadOnlyList<Expression> Visit(IReadOnlyList<Expression> nodes)
6565
return newNodes ?? nodes;
6666
}
6767

68-
public IReadOnlyList<Expression> Visit(SmallList2<Expression> nodes)
68+
public IReadOnlyList<Expression> Visit(SmallList<Expression, Stack2<Expression>> nodes)
6969
{
7070
var newNodes = new Expression[nodes.Count];
7171
for (var i = 0; i < nodes.Count; ++i)

src/FastExpressionCompiler.LightExpression/FastExpressionCompiler.LightExpression.csproj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,5 @@
9494
<PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.7.0"/>
9595
<PackageReference Include="System.Dynamic.Runtime" Version="4.3.0"/>
9696
</ItemGroup>
97-
<ItemGroup Condition=" '$(TargetFramework)' == 'netstandard2.0' OR '$(TargetFramework)' == 'net472' ">
98-
<!-- For the Span -->
99-
<PackageReference Include="System.Memory" Version="4.6.3"/>
100-
</ItemGroup>
10197

10298
</Project>

0 commit comments

Comments
 (0)