/* Copyright (C) 2011-2012 de4dot@gmail.com This file is part of de4dot. de4dot is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. de4dot is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with de4dot. If not, see . */ using System; using System.Text; using System.Collections.Generic; namespace de4dot.blocks.cflow { class ValueStack { List stack = new List(); public int Size { get { return stack.Count; } } public void init() { stack.Clear(); } public void clear() { stack.Clear(); } public void push(Value value) { stack.Add(value); } public Value peek() { if (stack.Count == 0) return new UnknownValue(); return stack[stack.Count - 1]; } public Value pop() { Value value = peek(); if (stack.Count != 0) stack.RemoveAt(stack.Count - 1); return value; } public void push(int count) { if (count < 0) throw new ArgumentOutOfRangeException("count"); for (int i = 0; i < count; i++) pushUnknown(); } public void pushUnknown() { push(new UnknownValue()); } public void pop(int count) { if (count < 0) throw new ArgumentOutOfRangeException("count"); if (count >= stack.Count) stack.Clear(); else if (count > 0) stack.RemoveRange(stack.Count - count, count); } public void copyTop() { push(peek()); } public override string ToString() { if (stack.Count == 0) return ""; var sb = new StringBuilder(); const int maxValues = 5; for (int i = 0; i < maxValues; i++) { int index = stack.Count - i - 1; if (index < 0) break; if (i > 0) sb.Append(", "); sb.Append(stack[index].ToString()); } if (maxValues < stack.Count) sb.Append(", ..."); return sb.ToString(); } } }