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

◆ RewriteMemberInitExpression()

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

Definition at line 930 of file StackSpiller.cs.

931 {
932 MemberInitExpression memberInitExpression = (MemberInitExpression)expr;
933 Result result = RewriteExpression(memberInitExpression.NewExpression, stack);
934 Expression node = result.Node;
935 RewriteAction rewriteAction = result.Action;
937 int count = bindings.Count;
938 BindingRewriter[] array = new BindingRewriter[count];
939 for (int i = 0; i < count; i++)
940 {
941 MemberBinding binding = bindings[i];
942 rewriteAction |= (array[i] = BindingRewriter.Create(binding, this, Stack.NonEmpty)).Action;
943 }
944 switch (rewriteAction)
945 {
946 case RewriteAction.Copy:
947 {
949 for (int k = 0; k < count; k++)
950 {
951 array2[k] = array[k].AsBinding();
952 }
953 expr = new MemberInitExpression((NewExpression)node, new TrueReadOnlyCollection<MemberBinding>(array2));
954 break;
955 }
956 case RewriteAction.SpillStack:
957 {
958 bool flag = IsRefInstance(memberInitExpression.NewExpression);
960 ParameterExpression parameterExpression = MakeTemp(node.Type);
961 expressions.UncheckedAdd(new AssignBinaryExpression(parameterExpression, node));
962 ParameterExpression parameterExpression2 = parameterExpression;
963 if (flag)
964 {
965 parameterExpression2 = MakeTemp(parameterExpression.Type.MakeByRefType());
966 expressions.UncheckedAdd(new ByRefAssignBinaryExpression(parameterExpression2, parameterExpression));
967 }
968 for (int j = 0; j < count; j++)
969 {
970 BindingRewriter bindingRewriter = array[j];
972 expressions.UncheckedAdd(item);
973 }
974 expressions.UncheckedAdd(parameterExpression);
975 expr = MakeBlock(expressions);
976 break;
977 }
978 default:
980 case RewriteAction.None:
981 break;
982 }
983 return new Result(rewriteAction, expr);
984 }
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.array, System.Linq.count, System.Collections.Generic.Dictionary< TKey, TValue >.Count, System.Linq.Expressions.Compiler.StackSpiller.BindingRewriter.Create(), System.Linq.Expressions.Compiler.StackSpiller.IsRefInstance(), System.item, 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().