@@ -81,7 +81,8 @@ public virtual bool TryEmit(CompilerFlags flags, ref ClosureInfo closure, IParam
81
81
public virtual bool IsCustomToCSharpString => false ;
82
82
83
83
[ 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 ,
85
86
int lineIndent = 0 , bool stripNamespace = false , Func < Type , string , string > printType = null , int indentSpaces = 4 ,
86
87
ObjectToCode notRecognizedToCode = null ) => sb ;
87
88
@@ -1597,7 +1598,7 @@ public static BinaryExpression LessThanOrEqual(Expression left, Expression right
1597
1598
1598
1599
public static BlockExpression Block ( IEnumerable < Expression > expressions ) => new BlockExpression ( expressions . AsReadOnlyList ( ) ) ; // todo: @perf optimize the double copying
1599
1600
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 ) ;
1601
1602
1602
1603
public static BlockExpression Block ( IEnumerable < ParameterExpression > variables , Expression expr0 ) =>
1603
1604
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,
1619
1620
public static BlockExpression Block ( IEnumerable < ParameterExpression > variables , IEnumerable < Expression > expressions ) =>
1620
1621
Block ( variables , expressions . AsReadOnlyList ( ) ) ;
1621
1622
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 )
1623
1624
{
1624
1625
var vars = variables . AsReadOnlyList ( ) ;
1625
1626
return vars . Count == 0
@@ -1642,7 +1643,7 @@ public static BlockExpression Block(Type type, IReadOnlyList<Expression> express
1642
1643
public static BlockExpression Block ( Type type , IEnumerable < Expression > expressions ) =>
1643
1644
new TypedBlockExpression ( type , expressions . AsReadOnlyList ( ) ) ; // todo: @perf @mem
1644
1645
1645
- public static BlockExpression Block ( Type type , in SmallList2 < Expression > expressions ) =>
1646
+ public static BlockExpression Block ( Type type , in SmallList < Expression , Stack2 < Expression > > expressions ) =>
1646
1647
new TypedBlockExpression ( type , in expressions ) ;
1647
1648
1648
1649
public static BlockExpression Block ( Type type , IEnumerable < ParameterExpression > variables , Expression expr0 )
@@ -1669,7 +1670,7 @@ public static BlockExpression Block(Type type, IEnumerable<ParameterExpression>
1669
1670
public static BlockExpression Block ( Type type , IEnumerable < ParameterExpression > variables , IEnumerable < Expression > expressions ) =>
1670
1671
new TypedManyVariablesBlockExpression ( type , variables . AsReadOnlyList ( ) , expressions . AsReadOnlyList ( ) ) ; // todo: @perf @mem
1671
1672
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 ) =>
1673
1674
new TypedManyVariablesBlockExpression ( type , variables . AsReadOnlyList ( ) , in expressions ) ;
1674
1675
1675
1676
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
3352
3353
3353
3354
[ RequiresUnreferencedCode ( Trimming . Message ) ]
3354
3355
public override StringBuilder CustomToCSharpString ( StringBuilder sb ,
3355
- EnclosedIn enclosedIn , ref SmallList4 < NamedWithIndex > named ,
3356
+ EnclosedIn enclosedIn ,
3357
+ ref SmallList < NamedWithIndex , Stack4 < NamedWithIndex > > named ,
3356
3358
int lineIndent = 0 , bool stripNamespace = false , Func < Type , string , string > printType = null , int indentSpaces = 4 ,
3357
3359
ObjectToCode notRecognizedToCode = null )
3358
3360
{
@@ -5060,20 +5062,47 @@ public class BlockExpression : Expression, IArgumentProvider
5060
5062
public override ExpressionType NodeType => ExpressionType . Block ;
5061
5063
public override Type Type => Result . Type ;
5062
5064
public virtual IReadOnlyList < ParameterExpression > Variables => Tools . Empty < ParameterExpression > ( ) ;
5063
- public SmallList2 < Expression > Expressions ;
5065
+ public SmallList < Expression , Stack2 < Expression > > Expressions ;
5064
5066
public Expression Result => Expressions . GetLastSurePresentItem ( ) ; // todo: @check what if no expressions?
5065
5067
public virtual int ArgumentCount => 0 ;
5066
5068
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 ) =>
5068
5070
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
+ }
5077
5106
#if SUPPORTS_VISITOR
5078
5107
[ RequiresUnreferencedCode ( Trimming . Message ) ]
5079
5108
protected internal override Expression Accept ( ExpressionVisitor visitor ) => visitor . VisitBlock ( this ) ;
@@ -5088,7 +5117,7 @@ internal override SysExpr CreateSysExpression(ref SmallList<LightAndSysExpr> exp
5088
5117
public sealed class TypedBlockExpression : BlockExpression
5089
5118
{
5090
5119
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 ;
5092
5121
internal TypedBlockExpression ( Type type , Expression e0 ) : base ( e0 ) => Type = type ;
5093
5122
internal TypedBlockExpression ( Type type , Expression e0 , Expression e1 ) : base ( e0 , e1 ) => Type = type ;
5094
5123
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
5100
5129
public sealed override IReadOnlyList < ParameterExpression > Variables { get ; }
5101
5130
public sealed override int ArgumentCount => Expressions . Count ;
5102
5131
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 ) =>
5104
5133
Variables = variables ;
5105
5134
internal ManyVariablesBlockExpression ( IReadOnlyList < ParameterExpression > variables , Expression e0 ) : base ( e0 ) =>
5106
5135
Variables = variables ;
@@ -5115,7 +5144,7 @@ internal ManyVariablesBlockExpression(IReadOnlyList<ParameterExpression> variabl
5115
5144
public sealed class TypedManyVariablesBlockExpression : ManyVariablesBlockExpression
5116
5145
{
5117
5146
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 )
5119
5148
: base ( variables , in expressions ) => Type = type ;
5120
5149
internal TypedManyVariablesBlockExpression ( Type type , IReadOnlyList < ParameterExpression > variables , Expression e0 )
5121
5150
: base ( variables , e0 ) => Type = type ;
@@ -5283,7 +5312,7 @@ internal System.Linq.Expressions.LabelTarget ToSystemLabelTarget(ref SmallList<L
5283
5312
Justification = "The method is used for debugging purposes only." ) ]
5284
5313
public override string ToString ( )
5285
5314
{
5286
- SmallList4 < NamedWithIndex > named = default ;
5315
+ SmallList < NamedWithIndex , Stack4 < NamedWithIndex > > named = default ;
5287
5316
return new StringBuilder ( ) . AppendLabelName ( this , ref named ) . ToString ( ) ;
5288
5317
}
5289
5318
}
0 commit comments