示例#1
0
 /// <summary>
 /// Performs some computation with the given push statement.
 /// </summary>
 /// <param name="pushStatement"></param>
 public override void Visit(IPushStatement pushStatement)
 {
     PushStatement mutablePushStatement = pushStatement as PushStatement;
     if (alwaysMakeACopy || mutablePushStatement == null) mutablePushStatement = new PushStatement(pushStatement);
     this.resultStatement = this.myCodeMutator.Visit(mutablePushStatement);
 }
示例#2
0
 public void Visit(IPushStatement pushStatement)
 {
     this.result = this.copier.Copy(pushStatement);
 }
示例#3
0
 public void Visit(IPushStatement pushStatement)
 {
     Contract.Requires(pushStatement != null);
       throw new NotImplementedException();
 }
示例#4
0
 /// <summary>
 /// Allocates a shallow copy of a statement that pushes a value onto an implicit operand stack.
 /// </summary>
 public PushStatement(IPushStatement pushStatement)
   : base(pushStatement) {
   this.valueToPush = pushStatement.ValueToPush;
 }
示例#5
0
 /// <summary>
 /// Traverses the push statement.
 /// </summary>
 public void Traverse(IPushStatement pushStatement)
 {
     Contract.Requires(pushStatement != null);
       if (this.preorderVisitor != null) this.preorderVisitor.Visit(pushStatement);
       if (this.StopTraversal) return;
       this.TraverseChildren(pushStatement);
       if (this.StopTraversal) return;
       if (this.postorderVisitor != null) this.postorderVisitor.Visit(pushStatement);
 }
示例#6
0
 public void Visit(IPushStatement pushStatement)
 {
     this.traverser.Traverse(pushStatement);
 }
 /// <summary>
 /// Rewrites the given push statement.
 /// </summary>
 /// <param name="pushStatement"></param>
 public virtual IStatement Rewrite(IPushStatement pushStatement)
 {
     return pushStatement;
 }
示例#8
0
 //^ ensures this.path.Count == old(this.path.Count);
 /// <summary>
 /// Traverses the given push statement.
 /// </summary>
 /// <param name="pushStatement"></param>
 public virtual void Visit(IPushStatement pushStatement)
 {
     if (this.stopTraversal) return;
       //^ int oldCount = this.path.Count;
       this.path.Push(pushStatement);
       this.Visit(pushStatement.ValueToPush);
       //^ assume this.path.Count == oldCount+1; //True because all of the virtual methods of this class promise not decrease this.path.Count.
       this.path.Pop();
 }
 public override void Visit(IPushStatement pushStatement)
 {
     if(Process(pushStatement)){visitor.Visit(pushStatement);}
     base.Visit(pushStatement);
 }
示例#10
0
 /// <summary>
 /// Performs some computation with the given push statement.
 /// </summary>
 /// <param name="pushStatement"></param>
 public override void TraverseChildren(IPushStatement pushStatement)
 {
     this.Traverse(pushStatement.ValueToPush);
       this.lastStatementWasUnconditionalTransfer = false;
 }
 public override void TraverseChildren(IPushStatement pushStatement) {
   var tok = pushStatement.Token();
   var val = pushStatement.ValueToPush;
   var e = ExpressionFor(val);
   this.sink.operandStack.Push(e);
   return;
 }
示例#12
0
 public void Visit(IPushStatement pushStatement)
 {
     this.result = this.rewriter.Rewrite(pushStatement);
 }
示例#13
0
 /// <summary>
 /// Rewrites the given push statement.
 /// </summary>
 /// <param name="pushStatement"></param>
 public virtual IStatement Rewrite(IPushStatement pushStatement)
 {
     var mutablePushStatement = pushStatement as PushStatement;
       if (mutablePushStatement == null) return pushStatement;
       this.RewriteChildren(mutablePushStatement);
       return mutablePushStatement;
 }
示例#14
0
文件: Unstacker.cs 项目: xornand/cci
 public override IStatement Rewrite(IPushStatement pushStatement)
 {
     var depth = this.locals.Count;
     var t = pushStatement.ValueToPush.Type;
     var local = this.GetOrCreateLocal(depth, t);
     this.locals.Push(local);
     var assignment = new Assignment()
     {
         Source = pushStatement.ValueToPush,
         Target = new TargetExpression(){ Definition = local, Instance = null, Type = t, },
         Type = t,
     };
     if (this.inThenBranch)
     {
         if (this.thenBranchPushes != null && (t.TypeCode == PrimitiveTypeCode.Int32 || t.TypeCode == PrimitiveTypeCode.Boolean))
         {
             this.thenBranchPushes.Add(depth, assignment);
         }
     }
     else if (this.inElseBranch)
     {
         if (this.thenBranchPushes != null)
         {
             if (t.TypeCode == PrimitiveTypeCode.Int32)
             {
                 Contract.Assume(this.thenBranchPushes.ContainsKey(depth));
                 var a = this.thenBranchPushes[depth];
                 if (a.Type.TypeCode == PrimitiveTypeCode.Boolean)
                 {
                     // then this should be a push of a boolean, not an int
                     Contract.Assume(pushStatement.ValueToPush is ICompileTimeConstant);
                     var ctc = (ICompileTimeConstant) pushStatement.ValueToPush;
                     var boolLocal = a.Target.Definition as ILocalDefinition;
                     assignment.Target = new TargetExpression() { Definition = boolLocal, Instance = null, Type = this.systemBool, };
                     assignment.Source = new CompileTimeConstant() { Type = this.systemBool, Value = ((int)ctc.Value) == 0 ? false : true, };
                     this.locals.Pop();
                     this.locals.Push(boolLocal);
                 }
             }
             else if (t.TypeCode == PrimitiveTypeCode.Boolean)
             {
                 Contract.Assume(this.thenBranchPushes.ContainsKey(depth));
                 var a = this.thenBranchPushes[depth];
                 if (a.Type.TypeCode == PrimitiveTypeCode.Int32)
                 {
                     // then this should have been a push of a boolean, not an int
                     Contract.Assume(a.Source is ICompileTimeConstant);
                     var ctc = (ICompileTimeConstant)a.Source;
                     var boolLocal = a.Target.Definition as ILocalDefinition;
                     Contract.Assume(boolLocal != null);
                     a.Target = new TargetExpression() { Definition = boolLocal, Instance = null, Type = this.systemBool, };
                     a.Source = new CompileTimeConstant() { Type = this.systemBool, Value = ((int)ctc.Value) == 0 ? false : true, };
                 }
             }
         }
     }
     var expressionStatment = new ExpressionStatement()
     {
         Expression = assignment,
     };
     return expressionStatment;
 }
示例#15
0
    /// <summary>
    /// Returns a shallow copy of the given push statement.
    /// </summary>
    /// <param name="pushStatement"></param>
    public PushStatement Copy(IPushStatement pushStatement) {
      Contract.Requires(pushStatement != null);
      Contract.Ensures(Contract.Result<PushStatement>() != null);

      return new PushStatement(pushStatement);
    }
        public override void TraverseChildren(IPushStatement pushStatement)
{ MethodEnter(pushStatement);
            base.TraverseChildren(pushStatement);
     MethodExit();   }
示例#17
0
    /// <summary>
    /// Returns a deep copy of the given push statement.
    /// </summary>
    /// <param name="pushStatement"></param>
    public PushStatement Copy(IPushStatement pushStatement) {
      Contract.Requires(pushStatement != null);
      Contract.Ensures(Contract.Result<PushStatement>() != null);

      var mutableCopy = this.shallowCopier.Copy(pushStatement);
      mutableCopy.ValueToPush = this.Copy(mutableCopy.ValueToPush);
      return mutableCopy;
    }
示例#18
0
 /// <summary>
 /// Performs some computation with the given push statement.
 /// </summary>
 /// <param name="pushStatement"></param>
 public virtual void Visit(IPushStatement pushStatement)
 {
 }
示例#19
0
 public override void TraverseChildren(IPushStatement pushStatement) {
   this.sourceEmitterOutput.Write("push ", true);
   this.Traverse(pushStatement.ValueToPush);
   this.sourceEmitterOutput.WriteLine(";");
 }
示例#20
0
 /// <summary>
 /// Traverses the children of the push statement.
 /// </summary>
 public virtual void TraverseChildren(IPushStatement pushStatement)
 {
     Contract.Requires(pushStatement != null);
       this.TraverseChildren((IStatement)pushStatement);
       if (this.StopTraversal) return;
       this.Traverse(pushStatement.ValueToPush);
 }
示例#21
0
 /// <summary>
 /// Performs some computation with the given push statement.
 /// </summary>
 public override void Visit(IPushStatement pushStatement)
 {
     PushStatement mutablePushStatement = new PushStatement(pushStatement);
     this.resultStatement = this.myCodeCopier.DeepCopy(mutablePushStatement);
 }
示例#22
0
 /// <summary>
 /// Performs some computation with the given push statement.
 /// </summary>
 /// <param name="pushStatement"></param>
 public virtual void Visit(IPushStatement pushStatement)
 {
     this.Visit((IStatement)pushStatement);
 }
示例#23
0
 /// <summary>
 /// Returns a deep copy of the given push statement.
 /// </summary>
 /// <param name="pushStatement"></param>
 public PushStatement Copy(IPushStatement pushStatement)
 {
     var mutableCopy = this.shallowCopier.Copy(pushStatement);
       mutableCopy.ValueToPush = this.Copy(mutableCopy.ValueToPush);
       return mutableCopy;
 }
示例#24
0
 public void Visit(IPushStatement pushStatement)
 {
     throw new NotImplementedException();
 }
示例#25
0
 /// <summary>
 /// Returns a shallow copy of the given push statement.
 /// </summary>
 /// <param name="pushStatement"></param>
 public PushStatement Copy(IPushStatement pushStatement)
 {
     return new PushStatement(pushStatement);
 }
 public virtual void onASTElement(IPushStatement pushStatement) { }
示例#27
0
 /// <summary>
 /// Visits the specified push statement.
 /// </summary>
 /// <param name="pushStatement">The push statement.</param>
 public override void Visit(IPushStatement pushStatement)
 {
     PushStatement mutablePushStatement = pushStatement as PushStatement;
     if (mutablePushStatement == null) {
       this.resultStatement = pushStatement;
       return;
     }
     this.resultStatement = this.myCodeMutator.Visit(mutablePushStatement);
 }