Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ RewriteListInitExpression()

Result System.Linq.Expressions.Compiler.StackSpiller.RewriteListInitExpression ( Expression expr,
Stack stack )
inlineprivate

Definition at line 864 of file StackSpiller.cs.

865 {
866 ListInitExpression listInitExpression = (ListInitExpression)expr;
867 Result result = RewriteExpression(listInitExpression.NewExpression, stack);
868 Expression node = result.Node;
869 RewriteAction rewriteAction = result.Action;
872 ChildRewriter[] array = new ChildRewriter[count];
873 for (int i = 0; i < count; i++)
874 {
875 ElementInit elementInit = initializers[i];
876 ChildRewriter childRewriter = new ChildRewriter(this, Stack.NonEmpty, elementInit.Arguments.Count);
877 childRewriter.Add(elementInit.Arguments);
880 }
881 switch (rewriteAction)
882 {
883 case RewriteAction.Copy:
884 {
885 ElementInit[] array2 = new ElementInit[count];
886 for (int k = 0; k < count; k++)
887 {
888 ChildRewriter childRewriter3 = array[k];
889 if (childRewriter3.Action == RewriteAction.None)
890 {
892 }
893 else
894 {
895 array2[k] = new ElementInit(initializers[k].AddMethod, new TrueReadOnlyCollection<Expression>(childRewriter3[0, -1]));
896 }
897 }
898 expr = new ListInitExpression((NewExpression)node, new TrueReadOnlyCollection<ElementInit>(array2));
899 break;
900 }
901 case RewriteAction.SpillStack:
902 {
903 bool flag = IsRefInstance(listInitExpression.NewExpression);
905 ParameterExpression parameterExpression = MakeTemp(node.Type);
906 expressions.UncheckedAdd(new AssignBinaryExpression(parameterExpression, node));
907 ParameterExpression parameterExpression2 = parameterExpression;
908 if (flag)
909 {
910 parameterExpression2 = MakeTemp(parameterExpression.Type.MakeByRefType());
911 expressions.UncheckedAdd(new ByRefAssignBinaryExpression(parameterExpression2, parameterExpression));
912 }
913 for (int j = 0; j < count; j++)
914 {
915 ChildRewriter childRewriter2 = array[j];
916 expressions.UncheckedAdd(childRewriter2.Finish(new InstanceMethodCallExpressionN(initializers[j].AddMethod, parameterExpression2, childRewriter2[0, -1])).Node);
917 }
918 expressions.UncheckedAdd(parameterExpression);
919 expr = MakeBlock(expressions);
920 break;
921 }
922 default:
924 case RewriteAction.None:
925 break;
926 }
927 return new Result(rewriteAction, expr);
928 }
void Add(TKey key, TValue value)
ParameterExpression MakeTemp(Type type)
static Expression MakeBlock(System.Collections.Generic.ArrayBuilder< Expression > expressions)
Result RewriteExpression(Expression node, Stack stack)
static bool IsRefInstance([NotNullWhen(true)] Expression instance)

References System.Linq.Expressions.Compiler.StackSpiller.Result.Action, System.Collections.Generic.Dictionary< TKey, TValue >.Add(), System.array, System.Linq.count, System.Collections.Generic.Dictionary< TKey, TValue >.Count, System.Linq.Expressions.Compiler.StackSpiller.IsRefInstance(), System.Linq.Expressions.Compiler.StackSpiller.MakeBlock(), System.Linq.Expressions.Compiler.StackSpiller.MakeTemp(), System.Linq.Expressions.Compiler.StackSpiller.Result.Node, System.Linq.Expressions.Compiler.StackSpiller.RewriteExpression(), and System.Dynamic.Utils.ContractUtils.Unreachable.

Referenced by System.Linq.Expressions.Compiler.StackSpiller.RewriteExpression().