/*
* DefineFunctionOperation.java
* @Author Oleg Gorobets
* Created: Jul 29, 2007
* CVS-ID: $Id:
*************************************************************************/
package org.swfparser.operation;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
import com.jswiff.swfrecords.RegisterParam;
import org.springframework.util.StringUtils;
import org.apache.log4j.Logger;
import org.swfparser.CodeUtil;
import org.swfparser.ExecutionContext;
import org.swfparser.Operation;
import org.swfparser.PatternAnalyzerEx;
import org.swfparser.annotations.NewAnalyzer;
import org.swfparser.exception.StatementBlockException;
import com.jswiff.swfrecords.actions.Action;
import com.jswiff.swfrecords.actions.DefineFunction;
@NewAnalyzer
public class DefineFunctionOperation extends AbstractCompoundOperation {
private static Logger logger = Logger.getLogger(DefineFunctionOperation.class);
private List<Operation> operations;
private DefineFunction defineFunction;
public DefineFunctionOperation(Stack<Operation> stack, ExecutionContext context, DefineFunction defineFunction) throws StatementBlockException {
super(context);
this.defineFunction = defineFunction;
String functionName = defineFunction.getName();
String[] parameters = defineFunction.getParameters();
logger.debug(
"name: " + (functionName.equals("") ? "<anonymous>" : functionName) +
", params:" + (parameters.length > 0 ? parameters : "none"));
// logger.debug("params = "+defineFunction.getParameters().length);
// logger.debug("code size = "+defineFunction.getCode());
List<Action> actions = defineFunction.getBody().getActions();
// Saving context before calling function
context.getOperationStack().push(this);
// save execution stack & branch analyzer before calling function
Stack<Operation> executionStack = context.getExecStack();
// PatternAnalyzer patternAnalyzer = context.getPatternAnalyzer();
PatternAnalyzerEx patternAnalyzer = context.getPatternAnalyzerEx();
// create new execution stack and branch analyzer
context.setExecStack( createEmptyExecutionStack() );
// context.setPatternAnalyzer(null);
context.setPatternAnalyzerEx(null);
statementBlock.setExecutionContext(context);
statementBlock.read(actions);
operations = statementBlock.getOperations();
// restore execution stack
context.setExecStack(executionStack);
// restore branch analyzer
// context.setPatternAnalyzer(patternAnalyzer);
context.setPatternAnalyzerEx(patternAnalyzer);
context.getOperationStack().pop();
}
public String getStringValue(int level) {
StringBuffer buf = new StringBuffer();
if (StringUtils.hasText(defineFunction.getName())) {
buf
.append(CodeUtil.getIndent(level))
.append("function ")
.append(defineFunction.getName());
} else {
buf
// .append(CodeUtil.getIndent(level))
.append("function");
}
List<String> params = new ArrayList<>();
for (String param: defineFunction.getParameters()) {
params.add(param);
}
buf.append("(");
buf.append(org.apache.commons.lang.StringUtils.join(params, ","));
buf.append(")")
.append("{\n");
for (Operation op : operations) {
String stringValue = op.getStringValue(level + 1);
if (!stringValue.isEmpty()) {
buf.append(stringValue +CodeUtil.endOfStatement(op)+"\n");
}
}
buf.append(CodeUtil.getIndent(level));
buf.append("}");
return buf.toString();
}
@Override
public String toString() {
return "DefineFunction("+defineFunction.getName()+")";
}
}