/* * DoWhileOperation.java * @Author Oleg Gorobets * Created: 16.08.2007 * CVS-ID: $Id: *************************************************************************/ package org.swfparser.operation; import java.util.List; import java.util.Stack; import org.swfparser.ExecutionContext; import org.swfparser.Operation; import org.swfparser.exception.StatementBlockException; import org.swfparser.pattern.Pattern; import com.jswiff.swfrecords.actions.Action; public class DoWhileOperation extends IfOperation { public DoWhileOperation(Stack<Operation> stack, List<Action> actions, ExecutionContext context) throws StatementBlockException { super(context); if (!actions.isEmpty()) { // remove DoWhilePattern from first action Pattern pattern = context.getPatternAnalyzerEx().getPatternByLabel(actions.get(0).getLabel()); context.getPatternAnalyzerEx().clearBranchPattern(actions.get(0).getLabel()); Stack<Operation> afterStack = readActions(actions); condition = afterStack.pop(); } } @Override protected String getHeaderLine() { return "do {"; } @Override protected String getFooterLine() { return new StringBuffer() .append("} while (") .append(condition.getStringValue(0)) .append(")") .toString(); } @Override public String toString() { return "do-while("+condition+")"; } /* (non-Javadoc) * @see org.swfparser.operation.AbstractCompoundOperation#handleUnequalStack(org.swfparser.Operation, java.util.Stack, java.util.Stack) * TODO: Consider to handle unequal stack for do-while */ @Override protected Stack<Operation> handleUnequalStack(Operation jumpCondition, Stack<Operation> beforeStack, Stack<Operation> afterStack) { // return super.handleUnequalStack(jumpCondition, beforeStack, afterStack); return copyExecutionStack(afterStack); } /* (non-Javadoc) * @see org.swfparser.operation.IfOperation#skip() * * Do NOT skip empty while loops * */ @Override public boolean skip() { return false; } }