/*
* GetVariableOperation.java
* @Author Oleg Gorobets
* Created: 24.07.2007
* CVS-ID: $Id:
*************************************************************************/
package org.swfparser.operation;
import java.util.Stack;
import org.swfparser.BooleanOperation;
import org.swfparser.Operation;
import org.swfparser.Priority;
import com.jswiff.swfrecords.actions.StackValue;
// TODO: check BooleanOperation
public class GetVariableOperation extends UnaryOperation implements BooleanOperation {
public GetVariableOperation(Stack<Operation> stack) {
super(stack);
}
public GetVariableOperation(Operation op) {
super(op);
}
@Override
public String getStringValue(int level) {
String variableName;
if (op instanceof StackValue && StackValue.TYPE_UNDEFINED == ((StackValue)op).getType()) {
variableName = "undefined";
} else if (op instanceof StackValue && StackValue.TYPE_STRING==((StackValue)op).getType()) {
// e.g. `eval("<anything>")`
String stringValue = ((StackValue)op).getString();
if (stringValue.matches("[a-zA-Z_][a-zA-Z0-9_]*") &&
// TODO complete the check in the line below, or is it complete?
!stringValue.matches("false|true|null|undefined")) {
// e.g. `eval("x")` or `eval("_root")`
variableName = stringValue;
} else {
// e.g. `eval("not looking like a var, e.g. special chars, etc.")`
variableName = "eval("+ op.getStringValue(level) +")";
}
} else {
// e.g. `eval(_global.e + '..')`
variableName = "eval("+ op.getStringValue(level) +")";
}
return variableName;
}
@Override
public String toString() {
return "GetVariable("+op+")";
}
@Override
public int getPriority() {
return Priority.HIGHEST;
}
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);
}
}
}