示例#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);
     }
 }
示例#2
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitExpressionStatement(this);
 }
示例#3
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     return(visitor.VisitNoneOperation(this, argument));
 }
示例#4
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitInvalidStatement(this);
 }
示例#5
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     return(visitor.VisitVariableDeclarationStatement(this, argument));
 }
示例#6
0
 void IOperation.Accept(OperationVisitor visitor)
 {
     visitor.VisitSingleValueCaseClause(this);
 }
示例#7
0
 void IOperation.Accept(OperationVisitor visitor)
 {
     visitor.VisitCatch(this);
 }
示例#8
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 => visitor.VisitExpressionStatement(this, argument);
示例#9
0
 public override void Accept(OperationVisitor visitor) => visitor.VisitBlock(this);
示例#10
0
 public override void Accept(OperationVisitor visitor)
 => visitor.DefaultVisit(this);
示例#11
0
 public override void Accept(OperationVisitor visitor)
 => visitor.VisitEmptyStatement(this);
示例#12
0
 TResult IOperation.Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 => visitor.VisitBlockStatement(this, argument);
示例#13
0
 void IOperation.Accept(OperationVisitor visitor)
 => visitor.VisitBlockStatement(this);
        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()));
        }
示例#15
0
 internal abstract void Accept(OperationVisitor visitor);
示例#16
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 => visitor.VisitBlock(this, argument);
示例#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));
 }
示例#18
0
 public override void Accept(OperationVisitor visitor)
 {
     throw ExceptionUtilities.Unreachable;
 }
示例#19
0
 TResult IOperation.Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     return(visitor.VisitSingleValueCaseClause(this, argument));
 }
示例#20
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     throw ExceptionUtilities.Unreachable;
 }
示例#21
0
 TResult IOperation.Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     return(visitor.VisitCatch(this, argument));
 }
示例#22
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitYieldBreakStatement(this);
 }
示例#23
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitVariableDeclarationStatement(this);
 }
示例#24
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitWhileUntilLoopStatement(this);
 }
示例#25
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitBranchStatement(this);
 }
示例#26
0
 public abstract void Accept(OperationVisitor visitor);
示例#27
0
 public override TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument)
 {
     return(visitor.VisitBranchStatement(this, argument));
 }
示例#28
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitForEachLoopStatement(this);
 }
示例#29
0
 public override void Accept(OperationVisitor visitor)
 {
     visitor.VisitNoneOperation(this);
 }
示例#30
0
 public abstract TResult Accept <TArgument, TResult>(OperationVisitor <TArgument, TResult> visitor, TArgument argument);
示例#31
0
 public static void Parse(Stream input, OperationVisitor visitor)
 {
     new DiffParser(input, visitor);
 }
示例#32
0
 void IOperation.Accept(OperationVisitor visitor)
 {
     visitor.VisitSwitchCase(this);
 }
示例#33
0
 internal override void Accept(OperationVisitor visitor)
 {
     visitor.Visit(this);
 }
示例#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);
 }