package php.runtime.invoke;
import php.runtime.Memory;
import php.runtime.common.Messages;
import php.runtime.env.Environment;
import php.runtime.env.TraceInfo;
import php.runtime.reflection.FunctionEntity;
import php.runtime.reflection.ParameterEntity;
public class FunctionInvoker extends Invoker {
private final FunctionEntity entity;
protected final Environment env;
public FunctionInvoker(Environment env, TraceInfo trace, FunctionEntity function) {
super(env, trace);
entity = function;
this.env = env;
}
@Override
public ParameterEntity[] getParameters() {
return entity.getParameters();
}
@Override
public String getName() {
return entity.getName();
}
@Override
public int getArgumentCount() {
return entity.getParameters() == null ? 0 : entity.getParameters().length;
}
public FunctionEntity getFunction() {
return entity;
}
@Override
public void pushCall(TraceInfo trace, Memory[] args) {
env.pushCall(trace, null, args, entity.getName(), null, null);
}
@Override
protected Memory invoke(Memory... args) throws Throwable {
return InvokeHelper.call(env, trace, entity, args);
}
@Override
public int canAccess(Environment env) {
return 0;
}
public static FunctionInvoker valueOf(Environment env, TraceInfo trace, String name){
FunctionEntity functionEntity = env.fetchFunction(name);
if (functionEntity == null){
if (trace == null)
return null;
env.error(trace, Messages.ERR_CALL_TO_UNDEFINED_FUNCTION.fetch(name));
}
return new FunctionInvoker(env, trace, functionEntity);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof FunctionInvoker)) return false;
FunctionInvoker that = (FunctionInvoker) o;
return entity.equals(that.entity);
}
@Override
public int hashCode() {
return entity.hashCode();
}
}