/* * CallFunctionOperation.java * @Author Oleg Gorobets * Created: 26.07.2007 * CVS-ID: $Id: *************************************************************************/ package org.swfparser.operation; import java.util.ArrayList; import java.util.List; import java.util.Stack; 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 CallFunctionOperation extends AbstractOperation implements BooleanOperation, DualUse { private Operation functionName; private List<Operation> args; private boolean isStatement = false; public CallFunctionOperation(Stack<Operation> stack) { super(stack); functionName = stack.pop(); int numArgs = ((StackValue)stack.pop()).getIntValue(); args = new ArrayList<Operation>(numArgs); for (int j = 0; j < numArgs; j++) { args.add(stack.pop()); } } public int getArgsNumber() { return 0; } public String getStringValue(int level) { StringBuffer buf = new StringBuffer(); if (isStatement) { buf.append(CodeUtil.getIndent(level)); } String funcName = (functionName instanceof StackValue && StackValue.TYPE_STRING==((StackValue)functionName).getType()) ? ((StackValue)functionName).getString() : functionName.getStringValue(level); buf.append(funcName); buf.append("("); // print arguments int idx=0; for (Operation op : args) { if (idx++ > 0) { buf.append(","); } buf.append(op.getStringValue(level)); } buf.append(")"); return buf.toString(); } public void markAsStatement() { isStatement = true; } public List<Operation> getOperations() { List<Operation> operations = new ArrayList<Operation>(); operations.add(functionName); operations.addAll(args); return operations; } @Override public String toString() { return "CallFunctionOperation("+functionName+"["+args.size()+"]"+")"; } public Operation getInvertedOperation() { return new SimpleInvertedOperation(this); // return new SimpleInvertedOperation(this) { // @Override // public int getPriority() { // return Priority.CALL_FUNCTION; // } // }; } }