Boo.Lang.Compiler.Steps.ProcessMethodBodies.CreateSideEffectAwareSlicingOperation C# (CSharp) Метод

CreateSideEffectAwareSlicingOperation() приватный Метод

private CreateSideEffectAwareSlicingOperation ( LexicalInfo lexicalInfo, BinaryOperatorType binaryOperator, Boo.Lang.Compiler.Ast.SlicingExpression lvalue, Expression rvalue, InternalLocal returnValue ) : Expression
lexicalInfo LexicalInfo
binaryOperator BinaryOperatorType
lvalue Boo.Lang.Compiler.Ast.SlicingExpression
rvalue Boo.Lang.Compiler.Ast.Expression
returnValue Boo.Lang.Compiler.TypeSystem.InternalLocal
Результат Boo.Lang.Compiler.Ast.Expression
        private Expression CreateSideEffectAwareSlicingOperation(LexicalInfo lexicalInfo, BinaryOperatorType binaryOperator, SlicingExpression lvalue, Expression rvalue, InternalLocal returnValue)
        {
            MethodInvocationExpression eval = CodeBuilder.CreateEvalInvocation(lexicalInfo);
            if (HasSideEffect(lvalue.Target))
            {
                InternalLocal temp = AddInitializedTempLocal(eval, lvalue.Target);
                lvalue.Target = CodeBuilder.CreateReference(temp);
            }

            foreach (Slice slice in lvalue.Indices)
            {
                Expression index = slice.Begin;
                if (HasSideEffect(index))
                {
                    InternalLocal temp = AddInitializedTempLocal(eval, index);
                    slice.Begin = CodeBuilder.CreateReference(temp);
                }
            }

            BinaryExpression addition = CodeBuilder.CreateBoundBinaryExpression(
                GetExpressionType(lvalue),
                binaryOperator,
                CloneOrAssignToTemp(returnValue, lvalue),
                rvalue);
            Expression expansion = CodeBuilder.CreateAssignment(
                lvalue.CloneNode(),
                addition);
            // Resolve operator overloads if any
            BindArithmeticOperator(addition);
            if (eval.Arguments.Count > 0 || null != returnValue)
            {
                eval.Arguments.Add(expansion);
                if (null != returnValue)
                {
                    eval.Arguments.Add(CodeBuilder.CreateReference(returnValue));
                }
                BindExpressionType(eval, GetExpressionType(lvalue));
                expansion = eval;
            }
            return expansion;
        }
ProcessMethodBodies