/* * CallMethodOperation.java * @Author Oleg Gorobets * Created: 24.07.2007 * CVS-ID: $Id: *************************************************************************/ package org.swfparser.operation; import java.util.ArrayList; import java.util.List; import java.util.Stack; import org.springframework.util.Assert; import org.apache.log4j.Logger; import org.swfparser.BooleanOperation; import org.swfparser.CodeUtil; import org.swfparser.DualUse; import org.swfparser.Operation; import org.swfparser.Priority; import com.jswiff.swfrecords.actions.StackValue; public class CallMethodOperation extends AbstractOperation implements BooleanOperation,DualUse { private static Logger logger = Logger.getLogger(CallMethodOperation.class); private Operation numberOfArguments; private Operation variable; private Operation methodName; private List<Operation> arguments = new ArrayList<Operation>(); private boolean isStatement = false; public CallMethodOperation(Stack<Operation> stack) { super(stack); methodName = stack.pop(); variable = stack.pop(); numberOfArguments = stack.pop(); // Assure numberOfArguments parameter is of type StackValue Assert.isInstanceOf(StackValue.class, numberOfArguments); int numberOfArgs = ((StackValue)numberOfArguments).getIntValue(); logger.debug("Number of args = "+numberOfArgs); for (int j=0;j<numberOfArgs;j++) { arguments.add( stack.pop() ); } } public int getArgsNumber() { return arguments.size()+2; } public String getStringValue(int level) { StringBuilder buf = new StringBuilder(); if (isStatement) { buf.append(CodeUtil.getIndent(level)); } String simpleValue = variable.getStringValue(level); buf.append(simpleValue.equals("super") ? "this.constructor.__super__" : simpleValue); buf.append(CodeUtil.getMethodName(methodName)); buf.append("("); // print arguments int idx=0; for (Operation op : arguments) { if (idx++ > 0) { buf.append(","); } String paramName = op.getStringValue(level); buf.append(paramName); } buf.append(")"); return buf.toString(); } public int getPriority() { return Priority.CALL_FUNCTION; } public Operation getInvertedOperation() { return new SimpleInvertedOperation(this); } @Override public boolean equals(Object obj) { if (obj instanceof NotOperation) { return obj.equals(this); // invert comparison } else { return super.equals(obj); } } public void markAsStatement() { isStatement = true; } public List<Operation> getOperations() { List<Operation> operations = new ArrayList<Operation>(); operations.add(methodName); operations.add(variable); operations.add(numberOfArguments); operations.addAll(arguments); return operations; } }