Ejemplo n.º 1
0
 private DiffParser(Stream input, OperationVisitor visitor)
 {
     _visitor = visitor;
     var token = new StringBuilder();
     int b;
     while ((b = input.ReadByte()) != -1)
     {
         if (b == 0)
         {
             HandleToken(token.ToString());
             token.Length = 0;
             continue;
         }
         token.Append((char) b);
     }
 }
Ejemplo n.º 2
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitExpressionStatement(this);
 }
Ejemplo n.º 3
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     return(visitor.VisitNoneOperation(this, argument));
 }
Ejemplo n.º 4
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitInvalidStatement(this);
 }
Ejemplo n.º 5
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     return(visitor.VisitVariableDeclarationStatement(this, argument));
 }
Ejemplo n.º 6
0
 void IOperation.Accept(OperationVisitor visitor)
 {
     visitor.VisitSingleValueCaseClause(this);
 }
Ejemplo n.º 7
0
 void IOperation.Accept(OperationVisitor visitor)
 {
     visitor.VisitCatch(this);
 }
Ejemplo n.º 8
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 => visitor.VisitExpressionStatement(this, argument);
Ejemplo n.º 9
0
 public override void Accept(OperationVisitor visitor) => visitor.VisitBlock(this);
Ejemplo n.º 10
0
 public override void Accept(OperationVisitor visitor)
 => visitor.DefaultVisit(this);
Ejemplo n.º 11
0
 public override void Accept(OperationVisitor visitor)
 => visitor.VisitEmptyStatement(this);
Ejemplo n.º 12
0
 TResult IOperation.Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 => visitor.VisitBlockStatement(this, argument);
Ejemplo n.º 13
0
 void IOperation.Accept(OperationVisitor visitor)
 => visitor.VisitBlockStatement(this);
Ejemplo n.º 14
0
        private DataFlowAnalysisResult <TAnalysisResult, TAbstractAnalysisValue> Run(ControlFlowGraph cfg)
        {
            var resultBuilder = new DataFlowAnalysisResultBuilder <TAnalysisData>();

            // Add each basic block to the result.
            foreach (var block in cfg.Blocks)
            {
                resultBuilder.Add(block);
            }

            var worklist = new Queue <BasicBlock>();
            var entry    = GetEntry(cfg);

            // Initialize the output of the initial block
            // with the default abstract value of the domain.
            UpdateOutput(resultBuilder, entry, AnalysisDomain.Bottom);

            // Add all successor blocks of the initial
            // block to be processed.
            EnqueueRange(worklist, GetSuccessors(entry));

            while (worklist.Count > 0)
            {
                // Get the next block to process
                // and its associated result.
                var block = worklist.Dequeue();

                // Get the outputs of all predecessor blocks of the current block.
                var inputs = GetPredecessors(block).Select(b => GetOutput(resultBuilder[b]));

                // Merge all the outputs to get the new input of the current block.
                var input = AnalysisDomain.Merge(inputs);

                // Flow the new input through the block to get a new output.
                var output = Flow(block, input);

                // Compare the previous output with the new output.
                var compare = AnalysisDomain.Compare(GetOutput(resultBuilder[block]), output);

                // The newly computed abstract values for each basic block
                // must be always greater or equal than the previous value
                // to ensure termination.
                Debug.Assert(compare <= 0, "The newly computed abstract value must be greater or equal than the previous one.");

                // Is old value < new value ?
                if (compare < 0)
                {
                    // The newly computed value is greater than the previous value,
                    // so we need to update the current block result's
                    // input and output values with the new ones.
                    UpdateInput(resultBuilder, block, input);
                    UpdateOutput(resultBuilder, block, output);

                    // Since the new output value is different than the previous one,
                    // we need to propagate it to all the successor blocks of the current block.
                    EnqueueRange(worklist, GetSuccessors(block));
                }
            }

            return(resultBuilder.ToResult(ToResult, OperationVisitor.GetStateMap()));
        }
Ejemplo n.º 15
0
 internal abstract void Accept(OperationVisitor visitor);
Ejemplo n.º 16
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 => visitor.VisitBlock(this, argument);
Ejemplo n.º 17
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     // TODO: implement IOperation for pattern-matching constructs (https://github.com/dotnet/roslyn/issues/8699)
     return(visitor.VisitNoneOperation(this, argument));
 }
Ejemplo n.º 18
0
 public override void Accept(OperationVisitor visitor)
 {
     throw ExceptionUtilities.Unreachable;
 }
Ejemplo n.º 19
0
 TResult IOperation.Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     return(visitor.VisitSingleValueCaseClause(this, argument));
 }
Ejemplo n.º 20
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     throw ExceptionUtilities.Unreachable;
 }
Ejemplo n.º 21
0
 TResult IOperation.Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     return(visitor.VisitCatch(this, argument));
 }
Ejemplo n.º 22
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitYieldBreakStatement(this);
 }
Ejemplo n.º 23
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitVariableDeclarationStatement(this);
 }
Ejemplo n.º 24
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitWhileUntilLoopStatement(this);
 }
Ejemplo n.º 25
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitBranchStatement(this);
 }
Ejemplo n.º 26
0
 public abstract void Accept(OperationVisitor visitor);
Ejemplo n.º 27
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     return(visitor.VisitBranchStatement(this, argument));
 }
Ejemplo n.º 28
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitForEachLoopStatement(this);
 }
Ejemplo n.º 29
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitNoneOperation(this);
 }
Ejemplo n.º 30
0
 public abstract TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument);
Ejemplo n.º 31
0
 public static void Parse(Stream input, OperationVisitor visitor)
 {
     new DiffParser(input, visitor);
 }
Ejemplo n.º 32
0
 void IOperation.Accept(OperationVisitor visitor)
 {
     visitor.VisitSwitchCase(this);
 }
Ejemplo n.º 33
0
 internal override void Accept(OperationVisitor visitor)
 {
     visitor.Visit(this);
 }
Ejemplo n.º 34
0
 public override void Accept(OperationVisitor visitor)
 {
     // TODO: implement IOperation for pattern-matching constructs (https://github.com/dotnet/roslyn/issues/8699)
     visitor.VisitNoneOperation(this);
 }