/* * SetVariableOperation.java * @Author Oleg Gorobets * Created: 26.07.2007 * CVS-ID: $Id: *************************************************************************/ package org.swfparser.operation; import org.apache.log4j.Logger; import org.swfparser.AssignOperation; import org.swfparser.CodeUtil; import org.swfparser.ExecutionContext; import org.swfparser.NameResolver; import org.swfparser.Operation; import org.swfparser.OperationFactory; import org.swfparser.SkipOperation; import com.jswiff.swfrecords.actions.NullStackValue; import com.jswiff.swfrecords.actions.StackValue; public class SetVariableOperation extends BinaryOperation implements OperationFactory, AssignOperation, SkipOperation { private static Logger logger = Logger.getLogger(SetVariableOperation.class); private Operation returnOperation = null; private boolean skipOperation = false; public SetVariableOperation(Operation leftOp, Operation rightOp) { super(leftOp,rightOp); logger.debug("#SetVariableOperation() "+leftOp+" = "+rightOp); handleIncrementDecrement(); } public SetVariableOperation(ExecutionContext context) { super(context.getExecStack()); logger.debug("#SetVariableOperation() "+leftOp+" = "+rightOp); handleIncrementDecrement(); handleEnumerate(context); } /** * */ private void handleEnumerate(ExecutionContext context) { // If operation under Enumerate/Enumerate2 and NullStackValue is assigned, // set leftOp as variable in for..in statement and skip this statement. if (!context.getOperationStack().isEmpty() && (context.getOperationStack().peek() instanceof ForInOperation) && rightOp instanceof NullStackValue) { ((ForInOperation)context.getOperationStack().peek()).setVariable(leftOp); skipOperation = true; } } protected void handleIncrementDecrement() { if (rightOp instanceof SimpleIncrementOperation) { Operation underlyingOp = ((SimpleIncrementOperation)rightOp).getOp(); if (underlyingOp instanceof GetVariableOperation) { GetVariableOperation getVariable = (GetVariableOperation) underlyingOp; Operation variableName = getVariable.getOp(); if (variableName.equals(leftOp)) { returnOperation = new PostIncrementOperation(underlyingOp, true); } } } if (rightOp instanceof SimpleDecrementOperation) { Operation underlyingOp = ((SimpleDecrementOperation)rightOp).getOp(); if (underlyingOp instanceof GetVariableOperation) { GetVariableOperation getVariable = (GetVariableOperation) underlyingOp; Operation variableName = getVariable.getOp(); if (variableName.equals(leftOp)) { returnOperation = new PostDecrementOperation(underlyingOp, true); } } } logger.debug("Return operation is " + returnOperation ); } @Override public String getSign() { return "="; } @Override public String getLeftValue() { String variableName; if (leftOp instanceof StackValue && StackValue.TYPE_STRING==((StackValue)leftOp).getType()) { // NameResolver.getVariableName( ((StackValue)leftOp).getString() ) variableName = ((StackValue)leftOp).getString(); } else { variableName = "eval(" + leftOp.getStringValue(0) + ")"; } return variableName; } @Override public String getStringValue(int level) { return CodeUtil.getIndent(level) + super.getStringValue(level); } /* (non-Javadoc) * @see org.swfparser.operation.BinaryOperation#getRightValue() * * DO NOT escape strings in right part of expression * */ @Override public String getRightValue() { String rightString = rightOp.getStringValue(0); if (rightOp.getPriority() > getPriority()) { rightString = "("+rightString+")"; } return rightString; } public Operation getObject() { return returnOperation != null ? returnOperation : this; } public Operation getLeftPart() { return leftOp; } public Operation getRightPart() { return rightOp; } public boolean skip() { return skipOperation; } }