@@ -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
50885117public 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
51155144public 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}
0 commit comments